2014-02-25 64 views
0

我有一個簡單的服務器多客戶端程序,將用戶的輸入發送給每個人。 服務器獲取消息,然後系統地將它們發送給每個人。爲什麼我的服務器沒有響應輸入,直到斷開連接?

我遇到的問題是,服務器獲取消息,但直到從服務器斷開連接後才發回。我爲每個用戶都有一個線程,並且有一個線程發送消息。

這裏是主服務器:

public static void main(String[] args) throws IOException { 
    ServerSocket serverSocket = new ServerSocket(25566); 
    SendThread SendThread = new SendThread(); 
    new Thread(SendThread).start(); 
    while(true){ 
     Socket clientSocket = serverSocket.accept(); 
     CollectThreads socketThread = new CollectThreads(clientSocket); 
     SendThread.Clients.add(socketThread); 
     new Thread(socketThread).start(); 
    } 


} 

這裏是輸入線程(CollectThreads):

public Socket Client; 
public CollectThreads(Socket socket) 
{ 
    //Here we set the socket to a local variable so we can use it later 
    Client = socket; 
} 
@Override 
public void run() { 
    System.out.println("i"); 
    try{ 
     PrintWriter out = new PrintWriter(Client.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(Client.getInputStream())); 
     out.println("Connected"); 
     boolean x = true; 
     while(x){ 
      String s; 
      if((s = in.readLine()) != null){ 
       System.out.println(s); 
       SendThread.log.add(s); 
      } 
     } 
    } catch(IOException exception) { 
     System.out.println("Error: " + exception); 
    } 

} 

和發件人(SendThread):

public ArrayList<CollectThreads> Clients = new ArrayList<CollectThreads>(); 
public static ArrayList<String> log = new ArrayList<String>(); 
@Override 
public void run() { 
    try{ 
    while(true){ 
     String x; 
     while(!Clients.isEmpty()){ 
      x = log.get(0); 
      for(int c = 0; c < Clients.size(); c += 1){ 
       PrintWriter out = new PrintWriter(Clients.get(c).Client.getOutputStream(), true); 
       out.println(x); 
       System.out.println(x); 
      } 
      log.remove(0); 
     } 
    } 
    } catch(IOException exception) { 
     System.out.println("Error: " + exception); 
    } 
} 

如果我輸入x,服務器控制檯打印x,我斷開連接,然後第二次打印x。 任何人都可以找到我的錯誤?或告訴我爲什麼這不起作用?

+2

您的服務器不會對readLine()正確返回null做出反應。它應該關閉套接字並退出循環。目前它在EOS上很難循環。 – EJP

+0

@EJP這是一個模擬,看看這個工程,我會盡快修復 – Hiblah200

+0

模擬ups仍然需要工作。第一次做錯了沒有好處。它只是給你別的東西來解決。 – EJP

回答

0

你永遠不會從SendThread.Clients中刪除任何東西,所以我不明白爲什麼它不會無限期地重新發送相同的東西。

這是一個非常奇怪的設計。爲什麼不讓每個客戶端線程發送自己的輸出,像其他人一樣?

+0

然後,我怎樣才能確保每個客戶端線程在從緩衝區中刪除消息之前輸出消息?然後,我會如何防止它發送消息兩次? – Hiblah200

+0

通過在我的最後一句話中提示? – EJP

相關問題