在我的应用程序中,我使用套接字连接与服务器通信。一切正常,我能够毫无问题地从/向服务器发送/接收。没有,只有一个。来自服务器的某个选项/响应比将连接打开大约30秒。服务器立即发送回复,但它保持连接打开,因此应用程序挂起,显示等待'消息,因为我似乎无法弄清楚如何关闭连接/ inputStream而不等待服务器关闭它。
有没有办法读取缓冲区收到的每个字符,一旦找到一个字符(例如,' *'),缓冲区应该关闭,并且还要连接到服务器。
任何帮助?
答案 0 :(得分:1)
您需要在客户端和服务器之间进行管理。一种方法是HTTP分块。 HTTP chunked发送第一个消息长度,然后发送消息数据。或者,如果您的情况如此,如果您知道“魔术”字节通知客户端连接可以关闭,您可以逐个读取数据,当您到达终结器字节时,您可以完成读取并关闭连接。否则,应用程序将挂起input.read()
,直到连接达到超时或新字节到达
InputStream input = ....;
ByteArrayOutputStream bo = new ByteArrayOutputStream();
while (true){
int singlebyte = input.read();
if (singlebyte == -1) break; //stream ends
bo.write(singlebyte);
if (singlebyte == '*'){
//the byte you are wating. at this point, you can break loop. or continue to read
bo.write(singlebyte);
byte data[] = bo.toByteArray();
}
}
答案 1 :(得分:0)
你做'读取找到的每个角色'。这里你的问题不是读取字符,而是服务器没有关闭连接,所以你被阻止等待流结束。这样的协议要么被破坏了,在这种情况下它需要重新设计,要么它包括一个长度指示器或其他一些知道消息何时完成的方法,你没有正确注意到它。