Android 套接字连接组合发送

Posted

技术标签:

【中文标题】Android 套接字连接组合发送【英文标题】:Android socket connection combining sends 【发布时间】:2012-07-12 22:47:21 【问题描述】:

现在我已经与我的桌面服务器建立了Socket 连接。一般来说,它工作正常,我正在尝试找到任何剩余的错误。我无法解决的一个问题是当我向“发送”按钮发送垃圾邮件时。有时它会将原本要单独发送的消息组合成一条消息。我相当确定这是一个 android 问题,而不是我的服务器的问题。以下是发生情况的示例(来自服务器的控制台输出):

XX.XX.XX.XX: "control":[],"commands":[]
XX.XX.XX.XX: "control":[],"commands":[]
XX.XX.XX.XX: "control":[],"commands":[]
XX.XX.XX.XX: "control":[],"commands":[]"control":[],"commands":[]

这导致我的 JSON 解析器无法正常工作。我能够通过蓝牙或 Wifi 连接到我的服务器,并且我注意到合并消息的问题仅在使用 Wifi 而不是蓝牙套接字时发生。并不是说我认为 BluetoothSocket 的延迟不足以像这样组合,但是那里运行的流量要少得多。有什么方法可以确保我的数据包在发送时不会被合并?我环顾了Socket 选项,但不知道要寻找什么。这是我如何发送的一个示例,非常基本:

mmDataOut.write(buffer);

其中mmDataOut 只是DataOutputStreambufferbyte[]

另外,我添加了 asyncsocket 标签,因为我的服务器正在使用它们,不确定这是否会影响任何东西。

【问题讨论】:

【参考方案1】:

听起来您正在使用 TCP。这是 TCP 的预期行为,您需要升级解析器以支持它。

您不能安全地假设来自读取端的一大块数据将仅包含一个命令,此外您也不能假设您将在一次读取中获得整个命令。

【讨论】:

我有一种感觉是由于 TCP。我使用的解析器无法处理它,因此我可以在解析之前手动遍历字符串以检查重复的 JSON 消息。现在我将只捕获错误并忽略解析。谢谢。 你真的应该把东西重新组装成完整的部分。如果性能不是一个特别关注的问题,可以通过一次读取一个字符直到找到终止条件来轻松完成。 @Atlos:虽然解析器可能无法处理部分或组合的消息(这很好),但您仍然有责任将消息拆分为解析器可以 处理。如果您因为向解析器提供了不可解析的输入而随机丢弃消息,那么您的通信将不可靠且不稳定。 @GregHewgill 是的,我一定会解决的。这是一个内部应用程序,我没有看到我的用户群正在捣碎我的按钮,如果它丢弃了解析,那么他们可以重新发送。它已添加到我的 TODO 中 :)

以上是关于Android 套接字连接组合发送的主要内容,如果未能解决你的问题,请参考以下文章

从android客户端通过套接字发送后收到黑色图像

只有一个 write() 调用通过套接字连接发送数据

如何在 Android 上建立套接字连接

如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?

socket

使用 XMPP 关闭 GCM 连接服务器的套接字