2017-10-17 11 views
0

私は簡単な質問があるチャットサーバーのコードを見つけました。以下の抜粋についてです。チャットサーバーからチャットクライアントに送信される配列の更新

clientOutputStreams.add(writer);

明らかに、この文字列はチャットクライアントに送信する必要がありますが、配列がどのように更新されるか、つまり特定のチャットクライアントからサーバーに送信された文字列が配列に蓄積され、すべてのチャットクライアントに送信します。あなたは?助けていただければ幸いです。

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は*文字列*の配列ではなく、* streams * =>の配列、つまりクライアントへの "パイプ"です。 – Joel

+0

合計で10のクライアントがある場合、clientOutputStreamのサイズは10ですか? – Duke

+0

はい、それです。クライアント接続が承認されるたびに、このリストが作成されます。以下の答えで述べるように、コンソールに文字列が書き込まれるたびに、一度に1文字ずつクライアントにブロードキャストされます。 – Joel

答えて

0

これは、文字列の配列ではありません。あなたは次の行から見ることができるように、それはPrintWritersの配列です:

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

が、私は、配列が今まで更新される方法を取得しない - すなわち、特定のチャットクライアントからサーバーに送信された文字列がでaccumualated方法その配列をすべてのチャットクライアントに送り返します。あなたは?

見える文字列が

public void tellEveryone(String message) 

機能を通じてチャットクライアントに送信されているように、この機能はPrintWritersのそれぞれをループし、各PrintWriterに渡された文字列messageを書き込みます。私は、これが各クライアントがメッセージをどのように見ているかを推測します。

+0

したがって、配列clientOutputStreamsのサイズは、サーバーに接続されているクライアントの量です - そうですか?ありがとう – Duke

0

clientOutputStreamsは文字列の配列ではありません。これは、接続されたすべてのクライアントにメッセージを送信するために使用されるWriterのリストです。クライアントがサーバーにメッセージを送信すると、サーバーはすべてのクライアント(リスト内のすべてのライター)にメッセージ(方法:tellEveryone)を送信します。 ClientHandlerクラスは、クライアントからのすべての着信メッセージを読み取るために使用されます。希望は、あなたが少し良いコードを理解するのに役立ちます。

関連する問題