【问题标题】:Android Socket StreamAndroid 套接字流
【发布时间】:2015-11-16 20:56:18
【问题描述】:

在我的应用程序中,我使用套接字连接与服务器通信。一切正常,我可以毫无问题地从/向服务器发送/接收。没有,只有一个。服务器有一个特定的选项/响应,而不是让连接保持打开大约 30 秒。服务器立即发送回复,但它保持连接打开,因此应用程序挂在那里显示“等待”消息,因为我似乎无法弄清楚如何在不等待服务器的情况下关闭连接/inputStream关闭它。

有没有办法读取缓冲区接收到的每个字符,一旦找到一个字符(例如'*'),缓冲区就应该关闭,并且与服务器的连接也应该关闭。

有什么帮助吗?

【问题讨论】:

  • 你可以使用http方式来做到这一点。 http 的功能之一是在发送实际数据之前发送流的长度。因此,您的应用程序可以知道将传输多少字节。但是,我不明白你为什么不逐个比较每个接收到的字节
  • Adem,我不能使用 http(相信我,如果可以的话,我会的),因为我不负责“服务器”端,所以,我必须使用我所拥有的给定:| .比较每个字节是什么意思?
  • 我没有说使用http,我建议像http一样处理它。你可以看看http chunked (en.wikipedia.org/wiki/Chunked_transfer_encoding)。查看我比较每个字节的答案

标签: java android sockets


【解决方案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();
    }
}

【讨论】:

  • 请不要使用仅代码的答案。该问题还表明与服务器的连接将被关闭。
  • Adem,你是救生员!大约 9 个月前,我偶然发现了这个问题(当时我还是一个 Android 新手,甚至无法弄清楚),最近才决定尝试修复它。谢谢你,我做到了!非常感谢..!!!
【解决方案2】:

'读取每个找到的字符'。您的问题不是读取字符,而是服务器没有关闭连接,因此您被阻止等待流结束。这样的协议要么被破坏,在这种情况下需要重新设计,要么它包含一个长度指示器或其他一些知道消息何时完成的方法,而你没有适当注意。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2023-03-18
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2021-12-11
    • 2011-07-29
    • 2011-04-30
    相关资源
    最近更新 更多