2013-07-04 118 views
0

我試圖使用套接字和線程將多個客戶端連接到服務器。也就是說,每次客戶端連接到服務器的端口時,服務器程序都會創建一個新線程並在它自己的線程上處理連接。目前,我在連接同一客戶端兩次時遇到問題。有誰知道如何防止這個問題?這是我的代碼。Android多線程程序中的多個套接字連接

這是我的服務器連接代碼:

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServerConnect { 
    public static void main(String[] args) throws IOException, 
      InterruptedException { 
     ServerSocket serverSocket = null; 
     // boolean listening = true; 

     try { 
      serverSocket = new ServerSocket(20001); 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 

      System.exit(-1); 
     } 
     int players = 6; 
     ServerHello[] cArray = new ServerHello[players]; 
     Thread[] threadPool = new Thread[players]; 

     for (int i = 0; i < players; i++) { 
      System.out.println("Connection number " + (i + 1) 
        + " waiting for client on port 20001."); 
      Socket clientServer = serverSocket.accept(); 
      cArray[i] = new ServerHello(clientServer); 
      threadPool[i] = new Thread(cArray[i]); 
      threadPool[i].start(); 

     } 

     for (int i = 0; i < players; i++) 
      threadPool[i].join(); 



      //My Code 


      for (int i = 0; i < players; i++) { 
      cArray[i].closeConnect(); 
     } 
     serverSocket.close(); 

我已經測試的客戶端連接,並知道它的工作原理。由於某些原因,服務器一直連接兩個相同的客戶端。

+0

很高興看到println調用的實際輸出,還有更多此類調用,以及您在自己的調試期間發現的內容,以及線程代碼以及缺少的「ServerHello」類。 –

回答

0

你可以防止它發生的唯一方法是每個客戶端應該有一個唯一的ID。然後服務器將接受來自客戶端的連接,客戶端將它的ID發送到服務器,服務器將檢查該相同的ID是否已經連接,然後創建一個新的線程來處理它,否則你可以刪除客戶端連接