Java消息不会发送到服务器,除非之前的客户端实例已关闭

Java消息不会发送到服务器,除非之前的客户端实例已关闭,java,sockets,server,client,chat,Java,Sockets,Server,Client,Chat,我正在创建一个程序,其中服务器可以接收来自多个客户端的消息。客户端将创建连接,然后单击按钮发送信息,然后关闭连接(不是来回的实时聊天程序) 我现在遇到的问题是,我运行服务器程序类,然后运行两次客户端程序(以模拟两个用户连接)。但是,当我发送关于第二个创建的客户机类的信息时,在第一个客户机关闭之前,它不会通过或被处理 这也是我第一次使用套接字和线程,所以如果您对我的错误有任何建议,我们将不胜感激 我现在只是通过静态调用这些方法 new Server().runServer(); publ

我正在创建一个程序,其中服务器可以接收来自多个客户端的消息。客户端将创建连接,然后单击按钮发送信息,然后关闭连接(不是来回的实时聊天程序)

我现在遇到的问题是,我运行服务器程序类,然后运行两次客户端程序(以模拟两个用户连接)。但是,当我发送关于第二个创建的客户机类的信息时,在第一个客户机关闭之前,它不会通过或被处理

这也是我第一次使用套接字和线程,所以如果您对我的错误有任何建议,我们将不胜感激

我现在只是通过静态调用这些方法

    new Server().runServer();

public void runServer() throws SocketException, IOException{
    serverSocket = new ServerSocket(PORT);
    System.out.println("Server up");

    while(true){
        Socket socket = serverSocket.accept();
        new ServerThread(socket).run();
    }
}

public class ServerThread extends Thread{ //
    Socket socket;
    ServerThread(Socket socket){
    this.socket = socket;
    }

    @Override
    public void run(){
        try {
            String message = null;
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while ((message = bufferedReader.readLine()) != null){
                  Server.addToQueue(message);
            }
        } catch (IOException ex) {
        } finally{
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException ex) {
            }
        }
    }
}
} 客户端代码如下所示:

public class Client {
    public static void main(String[]args){
        sendToServer();
    }
public static void sendToServer(){
    String readerInput;
    Socket socket = null; 
    PrintWriter printWriter = null;
    try {
        socket = new Socket("localhost", 4444);
        printWriter = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        readerInput = bufferedReader.readLine();
        printWriter.println(readerInput);
    } catch (IOException ex) {
    } finally{
        try {
            socket.close();
        } catch (IOException ex) {
        }
    }
}

}你把问题说错了。消息已正常发送,但未收到,因为服务器中存在错误:

new ServerThread(socket).run();
这应该是:

new ServerThread(socket).start();

目前,您的服务器不是多线程的,因此一次只能处理一个客户端。

调用
新服务器线程(socket)。run()
不会启动单独的线程,而是在当前线程中执行run方法。这就是为什么在第一个客户端断开连接之前,无法与第二个客户端进行通信的原因。为了创建单独的线程,您必须使用
start()
而不是
run()

谢谢,伙计:)这一改变奏效了,我想我需要更多地查找线程,而不是遵循教程。我想这是我在youtube上观看的几个随机java socket实时聊天示例的组合。然而,我认为他们可能使用了可运行的实现,而不是扩展线程,这就是为什么我可能会将run与start混淆的原因,我会感到惊讶
Runnable
vs.
Thread
对于是否应该使用
start()
没有区别。当有官方教程可用时,不要使用YouTube。谢谢,伙计:)这项更改奏效了,我想我需要更多地查找线程,而不是遵循教程