2014-12-04 2 views
1

BufferedReader 및 Buffered Writer를 통해 클라이언트/서버 소켓 연결을 시도하고 있지만 판독기가 읽히지 않은 경우 클라이언트가 올바르게 보내고 플러시되는 위치에 방금 정지되었습니다. 클라이언트가 서버에 아무것도 보내지 않는 것처럼 서버가 예외를 throw하지 않습니다. 클라이언트와 서버에 대해 동일한 사용하여 내 머리가 폭발 갈 것입니다Java 소켓 BufferedReader 읽기 읽기가 없습니다.

...

임 :

//inside of try catch 
while(true){ 
      while(!in.ready())// just to debug 
      System.out.println("READY: " + in.ready()); //just to debug 
      System.out.println("READY: OK"); //just to debug 
      msg = receive().toString(); //hangs here... 
      System.out.println("KEYIS: " + msg); 
      ///some stuff to do .... 

public StringBuilder receive() throws IOException { 
    StringBuilder str = new StringBuilder(); 
    int tmp; 
    while(true){ 
     tmp = in.read(); 
     if(tmp == 0) 
      break; 
     else if(tmp == -1) 
      throw new IOException(); 
     str.append((char)tmp); 
    } 
    return str; 
} 

클라이언트 코드 : 여기

in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 

서버의 코드입니다 : 여기에 걸려 있지 않다

//inside of try catch 
     send(KEY); //sended properly, no exception 
     while(true){ 
      send(KEY); // sended properly, no exception 
      System.out.println("sent"); 
      //System.out.println(receive().toString()); 
     } 

public void send(String str) throws IOException{ 
    out.write(str + "\n"); // 
    //out.newLine(); //tried too, not helped 
    out.flush(); //push message to server 
} 
+1

가 왜 당신을 ... \ 0 더 많은 데이터가 오는 것처럼, 그래서를 받게되며 방법은 기다리고 있었다 메시지의 끝을 결정하기 위해 추가하는 것을 잊었다 BufferedReader를 사용 하시겠습니까? 그것을 제거하려고 노력하면 도움이 될 것입니다. – vbezhenar

답변

1

Well 서버는 if(tmp == 0)0을 기다리지 않고 클라이언트가 절대 보내지 않습니다.
나는 그것이 0이 아닌 \n에 대해 기다리고 있다고 생각합니다. 10 (줄 바꿈)입니다.
DataOutputStream#writeUTF()DataInputStream#readUTF()을 왜 사용하지 않는지 궁금하십니까?

+0

\ 0은 데이터의 끝을 판별하는 데 사용되며 -1은 연결 오류가 있음을 의미합니다. – Bob

+0

readUTF는 lua 프로그램으로 해결할 수 없습니다. 서버에 연결됩니다. – Bob

+0

@Bob 아니요, * IOException' *는 연결에 오류가 있음을 의미합니다. -1은 피어가 연결을 닫았 음을 의미합니다. 오류 없음. – EJP

1

당신은 라인을 쓰고 있지만 실제로는 라인을 읽지 않고 스트림 끝 부분에서 잘못된 예외를 던지는 매우 무심하고 정교하고 매우 버그가 많은 입력 방법이 있습니다.

BufferedReader.readLine()을 시도하고 null을 잊지 말고 시험해보십시오.

+0

\ n \ r 문자를 포함 할 수있는 데이터를 전달해야하므로 사용하지 마십시오 readLine – Bob

+0

그래서'BufferedInputStream.read()'를 사용하고 바이너리 데이터의 컨테이너로'String'을 사용하지 마십시오. – EJP

0

해결 문제 ... 그래서 바보 같은 실수 ... 난 그냥

관련 문제