2016-09-30 2 views
0

서버에 대한 연결이 완료되었지만 항상 inputstream에서 데이터를 읽을 수있는 것은 아니며 한 번만 읽을 수 있습니다.sslsocket은 inputstream에서 한 번만 읽습니다. 이유가 무엇입니까?

public void startSSLClient() throws IOException { 
    inf = new Inflater(); 
    mSocketBufferReader = new BufferedReader(new InputStreamReader(mSslSocket.getInputStream())); 
    new Thread() { 
     boolean online =false; 
     String s; 
     @Override 
     public void run() { 
      try { 
       while (true) { 
        String str = mSocketBufferReader.readLine(); 
        if (!TextUtils.isEmpty(str)) { 
         Logger.e("PacketReader","process packet : "+str); 
        } 
       } 
      } 
      catch (Exception e) { 
       System.out.println("Error: " + e); 
      } 
     } 
    }.start(); 
} 

이렇게하면 입력 스트림에서 항상 읽을 수 있습니다.

public void startSSLClient() throws IOException { 
    inf = new Inflater(); 

    new Thread() { 
     boolean online =false; 
     String s; 
     @Override 
     public void run() { 
      try { 
       while (true) { 
        BufferedReader mSocketBufferReader = new BufferedReader(new InputStreamReader(mSslSocket.getInputStream())); 
        String str = mSocketBufferReader.readLine(); 
        if (!TextUtils.isEmpty(str)) { 
         Logger.e("PacketReader","process packet : "+str); 
        } 
       } 
      } 
      catch (Exception e) { 
       System.out.println("Error: " + e); 
      } 
     } 
    }.start(); 
} 

이유를 모르겠습니다. 난 그냥 글로벌 필드를 사용하고 싶습니다. 항상 새로운 지역 필드를 사용하고 싶지 않습니다.

+0

문제가 무엇인지, 아니면 글로벌 분야와 관련이 있는지 분명하지 않습니다. 'readLine()'에 null을 확인하고 읽음 루프를 종료해야합니다. 그리고 루프를 돌 때마다 새로운 버퍼링 된 판독기를 사용하지 않아야합니다. – EJP

+0

@EJP'if (! TextUtils.isEmpty (str))'는 null에 대한 결과를 확인합니다. 항상 inputstream에서 데이터를 읽고 싶습니다. 나는 처음으로 읽을 수 있습니다. 그런 다음 서버에 내 keeplive 메시지를 보내고 서버가 클라이언트에 응답합니다. –

+0

또한 빈 상태인지 검사하고 널 값을 얻으면 루프를 종료하지 않습니다. 단순히 비어있는 경우 ('''') 종료하지 않으려합니다. 당신이 가진 것이 충분하지 않습니다. 그 루프를 작성하는 일반적인 방법은'while ((str = reader.readLine())! = null)'입니다. – EJP

답변

0
BufferedReader mSocketBufferReader = new BufferedReader(new InputStreamReader(mSslSocket.getInputStream())); 

루프에서 제거하십시오. 연결에 대해 한 번만 해당 명령문을 실행할 수 있습니다.

+0

네 말이 맞아이게 내 첫 코드 야.하지만 입력 스트림에서 한 번 밖에 읽을 수 없다. 메시지가오고, bufferReader는 읽을 수 없다. –

+0

@DrDemon 어떤 메시지가 나옵니까? JDK는 그러한 메시지를 출력하지 않습니다. – EJP