2016-11-03 18 views
7

Java basit istemci-sunucu uygulaması uygulamak çalışıyorum içeride sadece bir kez çalıştırır. Java (True) ise ilmek ipliği

public class Server implements Runnable { 
    private int portNumber; 
    private String message; 

    private ServerSocket serverSocket; 
    private Socket clientSocket; 
    private PrintWriter writer; 
    private BufferedReader reader; 

    public Server(int portNumber, String message) { 
     this.portNumber = portNumber; 
     this.message = message; 
    } 

    private void listen() { 
     try { 
      serverSocket = new ServerSocket(portNumber); 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } 

     while (true) { 
      try { 
       clientSocket = serverSocket.accept(); 
       writer = new PrintWriter(clientSocket.getOutputStream(), true); 
       reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        System.out.println(line); 
       } 

       writer.println(message); 
      } catch (IOException e) { 
       System.err.println(e.getMessage()); 
       break; 
      } 
     } 
    } 

    public void run() { 
     listen(); 
    } 
} 

Server.java

Client.java

public class Client implements Runnable { 
    private String hostName; 
    private int portNumber; 
    private String message; 

    private Socket socket; 
    private PrintWriter writer; 
    private BufferedReader reader; 

    public Client(String hostName, int portNumber, String message) { 
     this.hostName = hostName; 
     this.portNumber = portNumber; 
     this.message = message; 
    } 

    public void connect() { 
     try { 
      socket = new Socket(hostName, portNumber); 
      writer = new PrintWriter(socket.getOutputStream(), true); 
      reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      writer.println(message); 
     } catch (UnknownHostException e) { 
      System.err.println("Could not resolve the host name '" + hostName + "'."); 
     } catch (IOException e) { 
      System.err.println("Could not get the I/O for the connection to '" + hostName + "'."); 
     } 
    } 

    private void listenForMessages() { 
     while (true) { 
      try { 
       System.out.println("In loop!"); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       System.err.println(e.getMessage()); 
      } 
     } 
    } 

    public void run() { 
     connect(); 
     listenForMessages(); 
    } 
} 

Ve bu ana sınıftır: Burada

kodudur

public class Test { 
    public static void main(String[] args) { 
     Client client = new Client("localhost", 4444, "Hello from client!"); 
     Server server = new Server(4444, "Hello from server!"); 

     Thread serverThread = new Thread(server); 
     serverThread.start(); 

     Thread clientThread = new Thread(client); 
     clientThread.start(); 
    } 
} 

mantığı kod basit: hem müşteri hem de rver bir while(true) döngü içinde mesajları bekliyor.

sunucunun listen yöntem içinde while döngü gayet çalıştırır. Ancak listenForMessages yöntemi içinde, döngü yalnızca bir kez yürütülecek görünüyor. Ekranda sadece bir "In loop" görüyorum. Sorunun ne

anlamaya?

Teşekkürler!

+0

sen kullanabilir miyim ayıklayıcı? –

+0

Eh, düz bir metin düzenleyicisi kullanıyorum ve hata ayıklayıcısını komut satırından nasıl kullanacağımı bilmiyorum. –

+2

Yan nota: ve istisnalarınızın hiçbirini görmezden geldiğinden eminsiniz? Gördüğünüz gibi, kodunuz sadece istisnalar için ** ** yazdırılıyor; ama sonra ne yaptığını sürdürmeye çalışır. İstisnalarda sadece ** başarısız ** düşünün! – GhostCat

cevap

6

Ancak listenForMessages yöntemi içinde, döngü yalnızca bir kez yürütülecek görünüyor. Ekranda sadece bir "In loop" görüyorum. döngü Eğer Server kodunu kontrol eğer burada bütün bir çizgi alır ve kadar reader.readLine() akım iplik bekleme yapacak çünkü basitçe sadece bir kez yürütülür çünkü

Aslında öyle değil, bu ilk okur ve reader.readLine()null akışının sonunda sadece sonsuz bir döngüde okur, böylece soket bu durumda kapatılacak. Eğer istemci ve sunucu arasındaki ping-pong çeşit uygulamak istiyorsanız

, basitçe sonra bir tarafta yazmak ve yazmak ve okumak ve okuma sonraki diğer tarafı:

Client kodu:

public void connect() { 
    try { 
     socket = new Socket(hostName, portNumber); 
     writer = new PrintWriter(socket.getOutputStream(), true); 
     reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    } catch (UnknownHostException e) { 
     System.err.println("Could not resolve the host name '" + hostName + "'."); 
    } catch (IOException e) { 
     System.err.println(
      "Could not get the I/O for the connection to '" + hostName + "'." 
     ); 
    } 
} 

private void listenForMessages() { 
    while (true) { 
     try { 
      System.out.println("In loop!"); 
      // Write the message for the server 
      writer.println(message); 
      // Read the message from the server 
      System.out.println(reader.readLine()); 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

Server kodu:

while (true) { 
    try { 
     clientSocket = serverSocket.accept(); 
     writer = new PrintWriter(clientSocket.getOutputStream(), true); 
     reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     while (true) { 
      // Read the message from the client 
      System.out.println(reader.readLine()); 
      // Write the message for the client 
      writer.println(message); 
     } 


    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
     break; 
    } 
} 

Çıktı:

In loop! 
Hello from client! 
Hello from server! 
In loop! 
Hello from client! 
Hello from server! 
... 
+1

Çok teşekkür ederim! Şimdi her şey açık. –