2012-01-08 123 views
0

我写了一个简单的程序,服务器应该打印多个客户端发送的数据。但服务器只接收部分数据。以下是代码的相关部分。服务器不接收来自多个客户端(java套接字)的数据

服务器:

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个连接? (这是原因,我关闭了服务器代码中的连接)

回答

1

你可能想要将socket的处理委托给另一个线程。我写了一个示例,它通过将每个传入套接字传递给Executor以便读取所有输入。我使用了一个Executors.newCachedThreadPool(),它应该随着需要增长。你也可以使用Executors.newFixedThreadPool(1),如果你希望它一次只能处理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(); 
+0

谢谢。看着你的代码,我意识到我的服务器代码的问题是缺少循环(用于读取数据)。它添加循环后工作正常(和我使用BufferedReader) – Raghava 2012-01-08 18:30:17

+0

我很高兴我可以帮助。如果您只是使用循环,则您的服务器一次只能处理来自一个客户端的输入。如果第二个客户端在第一个客户端仍在发送数据时连接,则第二个客户端将被迫等待并可能超时。 – patheros 2012-01-08 19:52:51

+0

好的,谢谢你的投入:)。我会按照你的建议使用线程。 – Raghava 2012-01-08 19:54:33

0

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

+0

我试过了,它也没有工作 – Raghava 2012-01-08 16:28:56

0

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

+0

我试过了,我删除了clientSocket.close()以及reader.close()。它不起作用。会有其他原因吗? – Raghava 2012-01-08 16:49:33

相关问题