-1

我已經實現了一個小型Java聊天室程序,客戶端可以與服務器通信。儘管多個客戶端無法工作 - 我相信這是因爲客戶端在連接時預留了套接字?有沒有簡單的方法來添加多個客戶端功能?謝謝你的幫助。與多個客戶端通信 - Java服務器

public void startRunning(){ 
     try{ 
     server = new ServerSocket(6789, 100); // port no, max users 
     while(true){ 
      try{ 
       waitForConnection(); 
       setupStreams(); 
       connectionRecieving(); 
      }catch(EOFException eofException){ 
       showMessage("Server ended connection \n"); 
      }finally{ 
       closeConnection(); 
      } 
     } 
     }catch(IOException ioException){ 
     ioException.printStackTrace(); 
     } 
    } 

    // Wait for connection 
    private void waitForConnection() throws IOException{ 
     showMessage("Attempting connection... \n"); 
     connection = server.accept(); 
     showMessage("Connected to: " + connection.getInetAddress().getHostName() + "\n"); 
    } 

    // Get stream to send and receive data 
    private void setupStreams() throws IOException{ 
     output = new ObjectOutputStream(connection.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(connection.getInputStream()); 
    } 

    // Close streams and sockets 
    private void closeConnection(){ 
     showMessage("----- \nClosing connections... \n"); 
     try{ 
     output.close(); 
     input.close(); 
     connection.close(); 
     }catch(IOException ioException){ 
     ioException.printStackTrace(); 
     } 
    } 
+3

問題是每個連接會覆蓋前一個連接。您需要有多個連接字段和多個輸入/輸出流。真的需要產生一個線程來處理連接,並且_it_可以維護連接和流。 – Gray 2013-02-14 19:29:07

+0

http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html - 請參閱本教程的最後一節,它有一個完整的工作示例,說明如何支持多個客戶端。 – 2013-02-14 19:42:14

回答

0

閱讀並同時寫入多個客戶端,您可能需要單獨的線程(阻塞IO),或者如果你想使用一個線程,NIO(非阻塞IO)。

您可以查看this post瞭解實施差異,但是NIO通常是更有效的方法。

使用阻塞I/O通常遵循上面使用的代碼,除非您需要單獨的線程來處理每個接受的套接字。使用NIO時,使用情況會更復雜一些;退房this tutorial