2016-12-21 10 views
1

안녕하세요 저는 자바로 작은 앱 클라이언트/서버를 작성하고 있습니다. 내가 스레드를 포함하는 솔루션 내놓았다 있도록 클라이언트가 영구적으로 여기에 있는지 여부를이 일을하는 것이 좋습니다 경우 나도 몰라 코드서버에서 수신 대기중인 클라이언트가 대기 중입니다.

package ClientCommunication; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Listen extends Thread { 

    String fromServer; 
    Socket kkSocket; 
    boolean connected = true; 

    Listen(Socket mysocket) { 
     this.kkSocket = mysocket; 
    } 

    @Override 

    public void run() { 
     while (connected) { 
      fromServer = null; 
      BufferedReader in = null; 
      try { 
       in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream())); 
      } catch (IOException ex) { 
       connected=false; 
       Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      try { 
       while (fromServer == null) { 
        fromServer = in.readLine(); 
       } 
      } catch (IOException ex) { 
       connected=false; 
       Logger.getLogger(Listen.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println("Received from Thread: " + fromServer); 
     } 
    } 
} 

가있어, 서버를 듣는 것을 필요로하고 내가 아닌 느낌 "우아한", 그래서 당신은 더 나은 솔루션으로 나를 도울 수 있습니까?

답변

1

그래서 여기에 코드 우아한 아니다 무엇 :

  • 당신은 모든 읽기의 입력 스트림을 다시 작성하십시오.
  • 중첩 된 while은 쓸모가 없으며 fromServer는 두 번째 반복에서는 null이 될 수 없습니다. 데이터가 스트리밍 될 때까지 중단됩니다. (파일을 읽는 것과는 다릅니다.)

이제 무엇을 할 수 있습니까? 루프가있는 동안 바깥 쪽을 제거하고 내부 루프에서 조건을 true (무한)로 변경하십시오. 예외적으로 만 종료됩니다.

또 다른 한가지는 안에 안에있는 인쇄 문을 이동하십시오. 그렇지 않으면 예외 후에 만 ​​호출되지 않습니다.

호프가 마음을 조금씩 드러내기를 바랍니다.

관련 문제