服务器没有';t从多个客户端(java套接字)接收数据

服务器没有';t从多个客户端(java套接字)接收数据,java,sockets,clients,Java,Sockets,Clients,我编写了一个简单的程序,其中服务器应该打印多个客户端发送的数据。但是服务器只接收部分数据。以下是代码的相关部分 服务器: try { serverSocket = new ServerSocket(8888); } catch (IOException e) { System.err.println("Could not listen on port: 8888"); System.exit(-1); } while (liste

我编写了一个简单的程序,其中服务器应该打印多个客户端发送的数据。但是服务器只接收部分数据。以下是代码的相关部分

服务器:

try {
        serverSocket = new ServerSocket(8888);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 8888");
        System.exit(-1);
    }
 while (listening) {
    Socket clientSocket = serverSocket.accept();
    BufferedReader reader = new BufferedReader(new InputStreamReader(
                            clientSocket.getInputStream()));
        System.out.println(reader.readLine());

        reader.close();
        clientSocket.close();
  }
  serverSocket.close();
客户:

  try {
        socket = new Socket("nimbus", 8888);
        writer = new PrintWriter(socket.getOutputStream(), true);
        localHost = InetAddress.getLocalHost();
    } 
    catch (UnknownHostException e) {} 
    catch (IOException e) {}

    StringBuilder msg1 = new StringBuilder("A: ");
    for(int i=1; i<=3; i++)
        msg1.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg1);

    StringBuilder msg2 = new StringBuilder("B: ");
    for(int i=4; i<=6; i++)
        msg2.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg2);

    StringBuilder msg3 = new StringBuilder("C: ");
    for(int i=7; i<=9; i++)
        msg3.append(i).append(' ');
    writer.println(localHost.getHostName() + " - " + msg3);

    writer.close();
    socket.close();
我没有收到第二条和第三条信息。服务器一直在等待。我哪里做错了


编辑:在服务器代码中,我尝试删除
reader.close()
clientSocket.close()
。那也没用。另一个问题——如果3个客户端发送3条消息,是否需要9个连接?(这就是原因,我在服务器代码中关闭了连接)

看起来您在客户端完成写入之前/在服务器读取其发送的所有消息之前关闭了与客户端的连接。我认为您需要继续,并且可能不会在客户端向您发送一条消息后终止客户端的连接。

John是对的。
读取消息后,通过调用clientsocket.close()关闭客户端连接,这就是无法获取其他消息的原因。当您收到所有消息时,应该调用clientsocket.close()

您可能希望将套接字的处理委托给另一个线程。我已经编写了一个示例,它通过将每个传入套接字传递给执行器来读取所有输入。我使用Executors.newCachedThreadPool(),它应该根据需要增长到最大。如果您希望Executors.newFixedThreadPool(1)一次只能处理一个客户端,那么也可以使用Executors.newFixedThreadPool(1)

我唯一做的另一个改变是移除了BufferedReader,并用扫描仪替换了它。我遇到了BufferedReader不返回数据的问题。我不知道为什么

Executor exe = Executors.newCachedThreadPool();
ServerSocket serverSocket = null;
try {
    serverSocket = new ServerSocket(8888);
} catch (IOException e) {
    System.err.println("Could not listen on port: 8888");
    System.exit(-1);
}
while (listening) {
    final Socket clientSocket = serverSocket.accept();

    exe.execute(new Runnable() {

        @Override
        public void run() {
            try {
                Scanner reader = new Scanner(clientSocket.getInputStream());
                while(reader.hasNextLine()){
                    String line = reader.nextLine();
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

}
serverSocket.close();

我试过了,删除了clientSocket.close()和reader.close()。它不起作用。还有其他原因吗?谢谢。查看您的代码,我意识到我的服务器代码的问题是缺少循环(用于读取数据)。在添加循环后,它工作得很好(我使用的是BufferedReader),我很高兴能提供帮助。如果只使用循环,服务器一次只能处理来自一个客户机的输入。如果第二个客户端在第一个客户端仍在发送数据时连接,则第二个客户端将被迫等待,并且可能会超时。好的,感谢您的输入:)。我会按照你的建议使用线程。
Executor exe = Executors.newCachedThreadPool();
ServerSocket serverSocket = null;
try {
    serverSocket = new ServerSocket(8888);
} catch (IOException e) {
    System.err.println("Could not listen on port: 8888");
    System.exit(-1);
}
while (listening) {
    final Socket clientSocket = serverSocket.accept();

    exe.execute(new Runnable() {

        @Override
        public void run() {
            try {
                Scanner reader = new Scanner(clientSocket.getInputStream());
                while(reader.hasNextLine()){
                    String line = reader.nextLine();
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

}
serverSocket.close();