Sockets 如何知道保持从套接字输入流读取是否安全(避免读取块)
我先给你讲一点背景: 我有一个类,应该在套接字中写一些查询,然后阅读答案。 这里是应该从inputStream读取的代码:Sockets 如何知道保持从套接字输入流读取是否安全(避免读取块),sockets,block,inputstream,Sockets,Block,Inputstream,我先给你讲一点背景: 我有一个类,应该在套接字中写一些查询,然后阅读答案。 这里是应该从inputStream读取的代码: private String getDataFromInputStream() throws IOException { StringBuilder sb = new StringBuilder(); InputStream stream = this.socket.getInputStream(); byte[] buff = new byte
private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();
InputStream stream = this.socket.getInputStream();
byte[] buff = new byte[1024];
int bytesRead = 0;
while(bytesRead >= 0)
{
bytesRead = stream.read(buff);
if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}
return sb.toString();
}
如果返回的结果是OK,那么这个方法工作得很好,但是如果出于某种原因,InputStream.read一直在等待输入,那么它当然会阻塞
所以我把代码改成了这个:
private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();
InputStream stream = this.socket.getInputStream();
byte[] buff = new byte[1024];
int bytesRead = 0;
while(stream.available() > 0)
{
bytesRead = stream.read(buff);
if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}
return sb.toString();
}
但这里有一个新问题:第二段代码不能读取整个响应。它只返回完整响应的一个片段
我知道available()方法返回0,因为流在缓冲区内没有更多的数据要读取,但是有更多的数据要从套接字读取
因此,我如何使一个方法灵活到足以读取整个内容,即使它需要一些时间来缓冲响应,并且在期望输入时也不会阻塞
如果查询成功,我需要得到整个响应,如果命令失败,套接字需要任何输入,我需要关闭输入,这样它就不会阻塞。stream.read()应该如何知道您知道最终还有更多数据要读取?使用适当的协议。第一个代码块,第二个代码循环,如果没有TCP之上的协议,您将无法对其进行排序。