2017-10-17 181 views
0

我發現了一個聊天服務器的代碼,我有一個簡短的問題。這是關於以下摘錄:從聊天服務器發送到聊天客戶端的數組更新

clientOutputStreams.add(作家);

顯然,這種字符串數組應該被髮送到聊天客戶端,但我不明白怎麼陣列不斷被更新 - 即如何發送到由特殊的聊天客戶端的服務器字符串數組中accumualated然後送回給所有聊天客戶。你做?將不勝感激你的幫助。

import java.io.*; 
import java.net.*; 
import java.util.*; 


public class VerySimpleChatServer { 
ArrayList clientOutputStreams; 

public class ClientHandler implements Runnable { 
    BufferedReader reader; 
    Socket sock; 

    public ClientHandler(Socket clientSOcket) { 
     try { 
      sock = clientSOcket; 
      InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); 
      reader = new BufferedReader(isReader); 

     } catch (Exception ex) { ex.printStackTrace(); } 
    } 

    public void run() { 
     String message; 
     try { 
      while ((message = reader.readLine()) != null) { 
       System.out.println("read " + message); 
       tellEveryone(message); 
      } 
     } catch (Exception ex) { ex.printStackTrace(); } 
    } 
} 

public static void main(String[] args) { 
    new VerySimpleChatServer().go(); 
} 

public void go() { 
    clientOutputStreams = new ArrayList(); 
    try { 
     ServerSocket serverSock = new ServerSocket(5000); 
     while(true) { 
      Socket clientSocket = serverSock.accept(); 
      PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); 
      clientOutputStreams.add(writer); 

      Thread t = new Thread(new ClientHandler(clientSocket)); 
      t.start(); 
      System.out.println("got a connection"); 
     } 
    } catch (Exception ex) { ex.printStackTrace(); } 
} 

public void tellEveryone(String message) { 
    Iterator it = clientOutputStreams.iterator(); 
    while (it.hasNext()) { 
     try { 
      PrintWriter writer = (PrintWriter) it.next(); 
      writer.println(message); 
      writer.flush(); 
     } catch (Exception ex) { ex.printStackTrace(); } 
    } 
} 

}

+1

clientOutputStreams不是一個* strings *數組,而是一個* streams * =>數組,即給客戶端的「管道」。 – Joel

+0

是否意味着如果總共有10個客戶端,那麼clientOutputStream的大小是10? – Duke

+0

是的,就是這樣。每次接受客戶端連接時,該列表都會增長。正如下面的答案所述,每次在控制檯上寫入一個字符串時,它都會一次向客戶端廣播一個字符串。 – Joel

回答

0

顯然,這種字符串數組應該被髮送到聊天客戶端,

這不是一個字符串數組。這是PrintWriters的數組,你可以從以下幾行看到:

PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); 
clientOutputStreams.add(writer); 

,但我不明白怎麼陣列不斷被更新 - 即如何發送到從特定聊天客戶端的服務器字符串中accumualated該數組然後發送回所有聊天客戶端。你做?

看起來像琴絃通過功能

public void tellEveryone(String message) 

此功能通過每個PrintWriters的循環發送到聊天客戶端和傳遞的字符串message寫入每個PrintWriter。我想這是每個客戶端看到這些消息的方式。

+0

因此,數組clientOutputStreams的大小是連接到服務器的客戶端數量 - 是對的嗎?謝謝 – Duke

0

clientOutputStreams不是一個字符串數組。它是一個Writer的列表,用於向所有連接的客戶端發送消息。當客戶端向服務器發送消息時,服務器將消息(方法:tellEveryone)發送給每個客戶端(列表中的每個寫入者)。 ClientHandler類用於讀取來自客戶端的所有傳入消息。希望能夠幫助你更好地理解代碼。