除非事先客户端实例关闭,否则Java消息不会发送到服务器

时间:2017-02-16 21:35:07

标签: java sockets server client chat

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

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

这也是我第一次使用套接字和线程,所以任何关于我做错的建议都会受到赞赏

我现在只是通过静态无效主电源调用方法

    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) {
        }
    }
}

}

2 个答案:

答案 0 :(得分:0)

你错误地说了这个问题。消息是正确发送的,但由于服务器中存在错误,

new ServerThread(socket).run();

应该是:

new ServerThread(socket).start();

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

答案 1 :(得分:0)

调用new ServerThread(socket).run()不会启动单独的线程,而是在当前线程中执行run-method。这就是为什么在第一个客户端断开连接之前没有与第二个客户端进行通信的原因。要创建单独的主题,您必须使用start()而不是run()