2016-12-21 4 views
1

私はちょっとしたチャットのプロンプトを出そうとしていますが、実際には計画通りには機能していません。文字列のリストをループしないためには?

new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      while (true){ 
       for (Socket s : s){ 
        for (String str : receive(s)){ 
         System.out.println("processing "+str); 
         if (str.startsWith("#reg")){ 
          str = str.replaceAll("#reg", ""); 
          registered.put(s.getInetAddress().toString(), str); 
          System.out.println("SERVER >> user "+str+" on "+s.getLocalAddress().toString()+" registered!"); 
          send(s, "#confirmed"); 
         }else{ 
          sendToAll(registered.get(s.getLocalAddress().toString())+" >> "+str); 
         } 
        } 
       } 
      } 
     } 
    }).start(); 

ここで、受信したすべてのメッセージをチェックしています。彼らはこの方法で受け取っています。

public List<String> receive(Socket s){ 
    try{ 
     List<String> lines = new ArrayList<String>(); 
     InputStream is = s.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      lines.add(line); 
      System.out.println("SRECEIVE >> "+line); 
     } 
     return lines; 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 

「SRECEIVE >> msg」というメッセージが表示されていますが、コンソールにポップアップ表示されています。 スレッド(第1コード)のSystem.out.println("processing "+str);行がポップアップしていません。 変数 "s"は(接続された)ソケットの配列です。 「受信(ソケット)」が呼び出される唯一の時間はそのスレッドです^^。

+0

InputStreamとBufferedReaderを読み終えたら、閉じることをお勧めします –

答えて

1

ストリームが閉じられるまで、このコードは

while ((line = br.readLine()) != null) { 
      lines.add(line); 
      System.out.println("SRECEIVE >> "+line); 
     } 

を実行していきますので。

これは別のスレッドで行う必要があります。

関連する問題