java聊天应用程序在其他机器上不工作

java聊天应用程序在其他机器上不工作,java,networking,Java,Networking,我已经做了一个基本的聊天应用程序,它在同一台电脑上运行良好,但我希望它也能在不同的机器上工作 为了简单起见,我省略了GUI代码。我从一个单独的应用程序接收IP、名称和端口,并将其传递给客户端的构造函数。我已输入运行服务器的机器的IP和端口 客户端 public class ClientGui extends JFrame implements Runnable, KeyListener, ActionListener { private JPanel contentPane; p

我已经做了一个基本的聊天应用程序,它在同一台电脑上运行良好,但我希望它也能在不同的机器上工作

为了简单起见,我省略了GUI代码。我从一个单独的应用程序接收IP、名称和端口,并将其传递给客户端的构造函数。我已输入运行服务器的机器的IP和端口

客户端

public class ClientGui extends JFrame implements Runnable, KeyListener, ActionListener
{
    private JPanel contentPane;
    private Socket socket;
    private String name , ip;
    private int port;
    private JTextField input;
    private JTextArea console;

    private JButton send;
    private String message;
    private DateFormat format;
    private BufferedReader in;
    private PrintWriter out;
    private String reply;

    public ClientGui(String name, String ip, int port)
    {
        format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);

        this.name = name;
        this.ip = ip;
        this.port = port;

        new Thread(this).start();
    }

    public void run()
    {
        try {
            socket = new Socket(ip, port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            while (true) {
                out.println(name);
                reply = in.readLine();

                if (reply.equals("NAME")) {
                    name = JOptionPane.showInputDialog("Name taken , Enter another");
                } else {
                    input.setEditable(true);
                    setTitle(name);
                    break;
                }
            }

            while (true) {
                reply = in.readLine();

                if (reply.startsWith("MESSAGE")) {
                    log(reply.substring(7));
                }
            }
        } catch (Exception e) {
            try {
                out.close();
                in.close();
                socket.close();
            } catch (Exception e2) {
                dispose();
                System.exit(0);
            }
            dispose();
            System.exit(0);
        }
    }
}
服务器

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;

public class Server implements Runnable
{
    private static ArrayList<PrintWriter> writers;
    private static HashSet<String> names;
    private Socket socket;
    private String name;
    private String message;

    public Server(Socket socket)
    {
        this.socket = socket;
    }

    public void run()
    {
        PrintWriter temp = null;

        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
                while (true) {
                    name = in.readLine();

                    if (names.contains(name)) {
                        out.println("NAME");
                    } else {
                        out.println("NAMEACCEPTED");
                        names.add(name);
                        break;
                    }
                }

                writers.add(out);
                temp = out;

                while(true) {
                    message = in.readLine();

                    for (PrintWriter writer : writers) {
                        writer.println("MESSAGE" + name + " : " + message);
                    }
                }
            }
        } catch (Exception e) {
            try {
                names.remove(name);
                writers.remove(temp);
                socket.close();
            } catch (Exception ignored) {
            }
        }
    }

    public static void main(String[] args)
    {
        writers = new ArrayList<>();
        names = new HashSet<>();
        ServerSocket server = null;

        try {
            int port = Integer.parseInt(args[0]);
            server = new ServerSocket(port);
        } catch (Exception e) {
            System.out.println("Enter a valid port");
            System.exit(0);
        }

        while (true) {
            try {
                System.out.println("Waiting for clients....");
                new Thread(new Server(server.accept())).start();
                System.out.println("Client Received");  
            } catch (Exception e) {
                System.out.println("Server can't accept clients");
                break;
            }
        }
    }
}
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
导入java.util.HashSet;
公共类服务器实现可运行
{
私人静态ArrayList作家;
私有静态哈希集名称;
专用插座;
私有字符串名称;
私有字符串消息;
公共服务器(套接字)
{
this.socket=socket;
}
公开募捐
{
PrintWriter temp=null;
try(BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())){
try(PrintWriter out=new PrintWriter(socket.getOutputStream(),true)){
while(true){
name=in.readLine();
if(name.contains(name)){
out.println(“名称”);
}否则{
out.println(“接受名称”);
名称。添加(名称);
打破
}
}
作者:加(出);
温度=输出;
while(true){
message=in.readLine();
for(打印作者:作者){
writer.println(“消息”+name+:“+MESSAGE”);
}
}
}
}捕获(例外e){
试一试{
姓名。删除(姓名);
删除(临时);
socket.close();
}捕获(忽略异常){
}
}
}
公共静态void main(字符串[]args)
{
writers=newarraylist();
名称=新的HashSet();
serversocketserver=null;
试一试{
int port=Integer.parseInt(args[0]);
服务器=新的服务器套接字(端口);
}捕获(例外e){
System.out.println(“输入有效端口”);
系统出口(0);
}
while(true){
试一试{
System.out.println(“等待客户…”);
新线程(新服务器(Server.accept()).start();
System.out.println(“客户收到”);
}捕获(例外e){
System.out.println(“服务器无法接受客户端”);
打破
}
}
}
}

我想可能是,因为
1) 您尚未在这两台设备上安装rigth jre版本
2) 您不在同一网络中,或者尚未转发您的Ip

您是否尝试在虚拟机箱中使用此功能

(客户端1==vbox1,服务器==计算机,客户端2==vbox2)


希望这有助于

为给大家带来的不便表示歉意

问题在于我切换时使用的端口,它在不同的机器上工作


感谢您的帮助

您是否已验证网络位是否正常工作?客户端是否连接到服务器?是的,当客户端和服务器在同一台机器上时连接。检查是否没有防火墙阻止联网,同时检查是否绑定到正确的网络接口。如果您绑定到0.0.0.0,它应该在所有网络接口上侦听。问题很可能不是您的代码,而是您代码的网络位或您计算机的设置。我尝试过另一个java聊天应用程序(不是我的代码),如果您使用TCP,它会在所有计算机上正常运行,也许安装wireshark来识别正在发生的事情。我尝试了另一个java聊天应用程序(不是我的代码),它在所有计算机上都正常运行。您确定服务器已分配足够的可用空间吗?