【问题标题】:Android socket connection combining sendsAndroid 套接字连接组合发送
【发布时间】: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 标签,因为我的服务器正在使用它们,不确定这是否会影响任何东西。

【问题讨论】:

    标签: java android sockets asyncsocket


    【解决方案1】:

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

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

    【讨论】:

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