2011-07-14 300 views
2

我必須創建一個套接字服務器來監聽多個客戶端。假設有6個客戶端同時連接到服務器,並且每個客戶端同時向服務器發送一些命令。如果這些客戶端每隔1秒向服務器發送消息,我如何處理來自服務器端的6個客戶端的這些消息,以將其存儲在表中並向每個客戶端發送確認。在java中有多個客戶端的套接字服務器

如何處理來自客戶端的這些輸入。是否必須創建6個線程來處理客戶端的這些輸入。

請給我一個想法來解決這個問題。

回答

0

你不能使用servlet容器來做這件事的任何理由?這是Servlet + Tomcat/Jetty中的10行代碼。

+0

要求是在socket.Anyway可以指導我如何做的servlet。 – bharathi

3

爲每個客戶端連接創建一個新線程,並不斷對每個線程中的流執行阻塞讀取以查找要處理的數據。

class Server { 

    ClientThread threads[]; 
    int    size; 
    ServerSocket serverSocket; 
    boolean   active; 

    Server() throws Exception { 
     /* initialize connection */ 
     active = true; 
     listen(); 
    } 

    void listen() throws Exception { 
     while (active) { 
      Socket clientSocket = serverSocket.accept(); 
      threads[ size++ ] = new ClientThread(clientSocket); 
      threads[ size - 1 ].start(); 
     } 
    } 
} 

class ClientThread extends Thread { 

    OutputStream out; 
    InputStream  in; 
    boolean   active; 

    ClientThread(Socket clientSocket) throws Exception { 
     out = clientSocket.getOutputStream(); 
     in = clientSocket.getInputStream(); 
    } 

    public void run() { 
     active = true; 
     while (active) { 
      listen(); 
     } 
    } 

    private void listen() { 
     try { 
      int res = process(in.read()); 
      out.write(res); 
     } catch (Exception e) {} 
    } 

    private int process(int b) { 
     return -1; 
    } 
} 
+0

+1,但有保留。我不會稱之爲「輪詢」,我會稱之爲阻塞式閱讀,你當然應該做一些關於EOS的事情。 – EJP

+0

是的,儘管我知道read()塊,while循環讓我開始思考輪詢。感謝您的高舉。 – blackcompe

相關問題