2011-10-21 2 views
2

Java를 사용하여 소켓을 배우려고합니다. 내 컴퓨터에서 실행중인 ServerSocket에 데이터를 성공적으로 보냈습니다. readline을 사용하여이 소켓에서 읽으려고 시도 할 때 (즉, 내 보낸 메시지를 반향시킬 수 있음) 프로그램이 중단되어 반환되지 않습니다.BufferedReader readLine 메서드가 응답을 멈추고 프로그램을 차단합니다.

여기에 코드입니다 :

public static void main(String[] args) throws UnknownHostException, IOException { 

    TCPClient cli = new TCPClient("127.0.0.1", "15000"); 
    try { 
     cli.ostream.writeUTF("Teste"); 
     String echo = cli.istream.readLine(); //it hangs in this line 
     System.out.println(echo); 
    } 

하여 TcpClient 내가 그래서 난 내 homwework에 스윙을 사용하기 전에 간단한 인터페이스에 내 프로그램을 테스트 할 수 있습니다 정의 된 클래스입니다. 여기에 코드가 있습니다 :

public class TCPClient { 

public DataOutputStream ostream = null; 
public BufferedReader istream = null; 

public TCPClient(String host, String port) throws UnknownHostException { 
    InetAddress ip = InetAddress.getByName(host); 

    try { 
     Socket socket = new Socket(host, Integer.parseInt(port)); 

     ostream = new DataOutputStream(socket.getOutputStream()); 
     istream = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


    } catch (IOException ex) { 
     Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

제 서버는 매우 간단합니다. 연결이 설정되면이 루프에 들어가서 클라이언트가 닫힐 때까지 여기에 머물러 있습니다 (무한 루프 때문에). 그 후, 일부 예외 처리는 연결이 시작되기 전에이를 처리합니다.

  while(true){ 
       String msg = istream.readLine(); 
       System.out.println("Arrived on server: " + msg); //just works on debug 
       ostream.writeUTF("ACK: " + msg); 
       ostream.flush(); 
      } 

실종보고 싶지 않습니다.

추신 : 만약 내가 서버를 디버깅하면 메시지 도착을 볼 수 있습니다 (예를 들어 인쇄 할 수 있습니다).하지만이 코드를 실행하면 불가능합니다. 이것은 내가 간과하고있는 동시성 관계를 가지고 있습니까?

들으

+1

서버의 기능은 무엇입니까? 메시지에 아무것도 응답하지 않거나 쓰기를 플러시하지 않으면 클라이언트는 서버에서 회선이 전송 될 때까지 무기한 대기합니다. –

+0

메시지를 반향하는 동안 서버의 무한 루프로 게시물을 편집합니다 –

답변

11

readLine은 줄을 읽는 중 문제가 발생합니다. 줄 끝까지 도달 할 때까지 줄을 반환하지 않습니다. 이것은 개행 문자 또는 통신의 끝을 기대한다는 것을 의미합니다. 서버가 개행 문자를 보내지 않고 스트림을 닫지 않으므로 클라이언트는 무기한 대기합니다.

+1

그게 다야! ostream.writeUTF ("ACK :"+ msg)에 '\ n'넣기; 일했다. 이제 의심의 여지가없는 두 개의 인쇄 할 수없는 문자가 내 클라이언트에 나타납니다. 그들은 무엇 일 수 있는가? –

+0

한 쪽에서 UTF로 작성하고 다른 쪽에서 플랫폼의 기본 인코딩을 사용하여 읽습니다. Writer를 사용하여 항상 글자를 씁니다. 특정의 명시적인 인코딩을 지정하는 OutputStreamWriter로 항상 출력 스트림을 랩합니다.동일하게 읽기를 수행하십시오. 항상 Reader를 사용하고 동일한 특정 인코딩을 지정하는 InputStreamReader로 입력 스트림을 래핑하십시오. –

+0

@Thiago Moraes Javadoc에 문서화되어있는 writeUTF()에 의해 거기에 놓이는 길이 단어 접두사입니다. 내 대답도 참조하십시오. – EJP

1
cli.ostream.writeUTF("Teste"); 

이 새로운 라인을 포함해야하지? 그렇지 않으면 read 메소드가 새로운 라인을 기다리고있을 것이라고 생각한다.

제안 된대로 ostream을 쓰고 나면 ostream을 플러시 할 수 있습니다.

+0

ostream은 출력 스트림입니다. OP는 서버가이 메시지를 올바르게 받았다고 말했다. 문제는 클라이언트가 서버로부터 응답을받지 못한다는 것입니다. –

+0

ostream을 플러시하고 '\ n'을 내 문자열에 추가했습니다. 이전에이 작업을 수행하지 않았습니다. 그러나 문제는 동일하게 계속됩니다./ –

1

writeUTF()는 줄을 쓰지 않습니다. Javadoc을 보라. writeUTF()는 readUTF()와 함께 사용됩니다. 독자는 작가와 함께 사용할 수 있습니다. DataOutputStream을 BufferedWriter로 변경하고 write()를 호출 한 다음 newline()을 호출하십시오.

+0

나는 당신이 말한 것을 이해한다고 믿지만, 유니 코드 지원이 필요하기 때문에 나는 영어 원어민이 아닌 것으로 간주합니다. 제 경우에 추천 할 수업의 조합은 무엇입니까? –

+0

@ThiagoMoraes 오타가났습니다. 판독기와 작성기를 사용하고 charset을 지정하십시오. – EJP

관련 문제