2016-09-30 78 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

是的,你是对的,这是我的第一个代码。但它只能从inputstream中读取一次。他们的消息即将到来,bufferReader无法读取。 –

+0

@DrDemon什么信息? JDK不输出任何此类消息。 – EJP