2016-12-21 2 views
1

Ich (versuche) eine kleine Chat-Eingabeaufforderung zu machen, aber es funktioniert derzeit nicht wirklich wie geplant.For-Schleife, die die Liste der Strings nicht durchläuft?

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(); 

Genau hier überprüfe ich alle empfangenen Nachrichten. Sie werden mit dieser Methode empfangen.

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; 
} 

was funktioniert, erscheint eine Nachricht mit "SRECEIVE >> msg" in der Konsole. Aber die Zeile im Thread (1. Code) wird nicht angezeigt. Die Variable "s" ist ein Array von (verbundenen) Sockets. Der einzige Zeitpunkt, an dem "receive (Socket s)" angerufen wird, ist in diesem Thread ^^.

+0

Es ist wahrscheinlich eine gute Idee, Ihren InputStream und BufferedReader zu schließen, wenn Sie damit fertig sind –

Antwort

1

Da dieser Code wird weiterhin

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

laufen, bis Strom geschlossen ist.

Sie müssen dies in einem separaten Thread tun.

Verwandte Themen