2015-11-16 55 views
0

在我的应用我使用套接字连接与服务器进行通信。一切正常,我可以发送/接收/发送到服务器没有问题。没有,只有一个。服务器有一定的选项/响应,而不是将连接打开约30秒。服务器发送回复马上,但它保持连接打开,因此应用程序挂在那儿显示“等待”消息,因为我似乎无法弄清楚如何关闭连接/的inputStream没有它等待服务器关闭它。Android的套接字流

有没有一种方法来读取一个字符是由缓冲区接收的,一旦每个字符缓冲区应该关闭,并与服务器的连接(例如“*”)。

任何帮助?

+1

可以使用http的方式来做到这一点。 http的一个特点是在发送实际数据之前发送流的长度。所以,您的应用程序可以知道将传输多少个字节。但是,我不明白你为什么不通过一个 – Adem

+0

阿德姆每接收到一个字节一个比较,我不能使用HTTP(相信我,我想如果我可以),因为我不负责的“服务器”端和,所以,我我已经与我所得到的一致:| 。你通过比较每个字节意味着什么? –

+1

我没有说使用http,我建议像http一样处理它。你可以看看http chunked(https://en.wikipedia.org/wiki/Chunked_transfer_encoding)。看看我的答案,比较每个字节 – Adem

回答

1

你需要客户端和服务器之间的管理。一种方法是HTTP分块。 HTTP分块发送消息的第一长度,然后发送消息数据。或者,如果你的情况是这样,如果你知道一个“魔术”字节通知客户端连接可以关闭,你可以逐一读取数据,当你达到终结器字节时,你可以完成你的阅读和关闭连接。否则,应用程序挂在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(); 
    } 
} 
+0

请不要使用代码唯一的答案。该问题还表明,与服务器的连接将被关闭。 –

+0

Adem,你是一个拯救生命的人!我在9个月前偶然发现了这个问题(当时我对Android的一个新手甚至想到了这一点),并且最近决定尝试修复它。感谢你,我做到了!非常感谢..!!! –

0

“因为它发现读取每个字符”。你这里的问题不是读字符,而是服务器没有关闭连接,所以你被阻塞等待流结束。这样的协议要么被打破了,在这种情况下需要重新设计,要么包括一个长度指示器或其他一些知道消息何时完成的手段,而这些手段你没有注意到。