2012-07-06 35 views
0

我試圖創建「多客戶端 - 單服務器」連接。 我的客戶機打開連接,並在服務器端,我在服務器端我已經創建ListArray的ServerSocket的每個ONF人我纏繞在線程創建來自ServerSocket的套接字驗證Java

 Client clt = new Client("127.0.0.1", 9000); 
     clt.openConn(); 

... 

public Client(String serverAddress, int serverPort) { 
    this.serverAddress = serverAddress; 
    this.serverPort = serverPort; 
} 
try { 
     this.clientSocket = new Socket(this.serverAddress, this.serverPort); 
     this.clientSocket.setKeepAlive(true); 
     this.clientSocket.setSoTimeout(0); 

      oos = new DataOutputStream(this.clientSocket.getOutputStream()); 
      ois = new DataInputStream(this.clientSocket.getInputStream());...} 

...

ServerSocket serverSocket = null ; 
     Socket clientSocket; 
     boolean listening = true; 
     ArrayList threadList = new ArrayList(); 
     Iterator itSrvThr; 
    try { 
      serverSocket = new ServerSocket(port); 

     } catch (IOException e) { 
      System.err.println("Could not listen on port: " + port + "."); 
      System.exit(-1); 
     } 
     while (listening) { 
      clientSocket = serverSocket.accept(); 
      ServerThread srvThread = new ServerThread(clientSocket); 
      srvThread.start(); 
`...` 
    } 

其中

ServerThread extends Thread 
    {... 
     public void run() { 
      this.ois = new DataInputStream(socket.getInputStream()); 
      this.oos = new DataOutputStream(socket.getOutputStream());  
     } 
    } 

我的程序發送和接收對象(我稱他們爲「Datagramm」),這是某種包裝的文件和字符串(讓我們說,這是對於某一國語言客戶端服務器)

現在關於我有問題。我必須在每次需要從服務器端測試「活着」套接字時進行驗證...... 我試圖在ArrayList中出現新元素時進行此驗證,但它給我帶來了「Datagramm's」發送

itSrvThr = threadList.iterator(); 
      while (itSrvThr.hasNext()) { 
       ServerThread st = (ServerThread) itSrvThr.next(); 
       boolean stoppedSocket = st.getStopped(); 

       if (stoppedSocket) { 
        st.stop(); 
        itSrvThr.remove(); 
       }else {??? resolution???} 

stoppedSocket - 這是一個值,它顯示程序關閉客戶端站點的套接字。

老實說,我只用了幾個星期的插座和線程,這就是爲什麼每個幫助和評論家都可以接受。 ... 感謝您的回答,但我在編碼心跳問題上存在問題。首先,心跳的位置必須放在服務器端。

+0

*問題是什麼?*如果套接字未被「停止」,您似乎在問怎麼辦。這是正常情況 - 你只是繼續使用它。困難的情況是決定它何時*停止。這是什麼? – EJP 2012-07-06 13:35:24

回答

1

我建議你發送心跳消息從客戶端和/或服務器,每當你還沒有發送消息一段時間(秒)另一端可以超時,當你還沒有收到任何東西的一些倍數時間。

如果您有像{message length} {message}這樣的協議,我使用message-length = 0作爲心跳。