java - 服务器不接收来自多个客户端的数据(java套接字)

标签 java sockets clients

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

服务器:

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();

我得到以下输出(在 3 个客户端上运行时)

nimbus2 - A: 1 2 3 
nimbus3 - A: 1 2 3 
nimbus4 - A: 1 2 3

我没有收到第二条和第三条消息。服务器一直在等待。我哪里出错了?

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

最佳答案

您可能希望将套接字的处理委托(delegate)给另一个线程。我编写了一个示例,该示例通过将每个传入套接字传递给执行器来工作,以便它可以读取所有输入。我使用 Executors.newCachedThreadPool() ,它应该根据需要增长到一样大。如果您希望它一次只能处理 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();

关于java - 服务器不接收来自多个客户端的数据(java套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778964/

相关文章:

cmd - 在 Windows Server 2012 上为客户端禁用 cmd 和 PowerShell

java - 解析2位数年份: Setting the pivot date with an unknown date pattern

java - 从 java 中的结果集(oracle db)获取 BigInt 值

java - 如何使用带有加密功能的 SQLiteJDBC 库 (sqlite-jdbc-crypt)

Python Opencv 和 Sockets - 以 h264 编码的流视频

c# - .NET 中的套接字 - 多线程服务器入门

java - Spring XD 流中的异常处理

Python 点对点聊天(套接字)

mysql - 解决: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

用于多个并发客户端的 Python UDP 套接字选项