Java Android套接字连接

Java Android套接字连接,java,android,sockets,asyncsocket,Java,Android,Sockets,Asyncsocket,现在,我已经与我的桌面服务器建立了Socket连接。总的来说,它工作得很好,我正在努力找到任何剩余的bug。我无法解决的一个问题是当我垃圾邮件发送我的“发送”按钮时。有时,它会将要单独发送的消息合并为一条消息。我相当肯定这是安卓系统的问题,而不是我的服务器的问题。下面是发生的情况的示例(来自服务器的控制台输出): 这导致我的JSON解析器无法正常工作。我可以通过蓝牙或Wifi连接到我的服务器,我注意到只有在使用Wifi而不是蓝牙插座时才会出现合并消息的问题。我不是说我不认为BluetoothSo

现在,我已经与我的桌面服务器建立了
Socket
连接。总的来说,它工作得很好,我正在努力找到任何剩余的bug。我无法解决的一个问题是当我垃圾邮件发送我的“发送”按钮时。有时,它会将要单独发送的消息合并为一条消息。我相当肯定这是安卓系统的问题,而不是我的服务器的问题。下面是发生的情况的示例(来自服务器的控制台输出):

这导致我的JSON解析器无法正常工作。我可以通过蓝牙或Wifi连接到我的服务器,我注意到只有在使用Wifi而不是蓝牙插座时才会出现合并消息的问题。我不是说我不认为BluetoothSocket可以延迟到像这样的组合,但是在那里运行的流量要少得多。有没有办法确保我的数据包在发送时不会被合并?我查看了
套接字
选项,不知道要查找什么。以下是我如何发送的示例,非常基本:

mmDataOut.write(缓冲区)

其中,
mmDataOut
只是一个
DataOutputStream
buffer
是一个
字节[]


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

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


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

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


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

我有一种感觉,这是由于TCP。我使用的解析器无法处理它,因此我可以在解析之前手动遍历字符串以检查重复的JSON消息。现在,我将只捕获错误并忽略解析。谢谢。你真的应该把东西重新组装成完整的零件。如果性能不是一个特别的问题,那么一次读取一个字符直到找到终止条件是很容易的。@Atlos:虽然解析器可能无法处理部分或组合消息(这很好),但您仍有责任将消息拆分为解析器可以处理的部分。如果您因为给解析器提供了不可解析的输入而随机丢弃消息,那么您的通信将是不可靠和脆弱的。@GregHewgill是的,我一定会处理它。这是一个内部应用程序,我没有看到我的用户群将我的按钮捣乱,如果它删除了一个解析,那么他们可以重新发送。它已添加到我的待办事项中:)我感觉这是由于TCP。我使用的解析器无法处理它,因此我可以在解析之前手动遍历字符串以检查重复的JSON消息。现在,我将只捕获错误并忽略解析。谢谢。你真的应该把东西重新组装成完整的零件。如果性能不是一个特别的问题,那么一次读取一个字符直到找到终止条件是很容易的。@Atlos:虽然解析器可能无法处理部分或组合消息(这很好),但您仍有责任将消息拆分为解析器可以处理的部分。如果您因为给解析器提供了不可解析的输入而随机丢弃消息,那么您的通信将是不可靠和脆弱的。@GregHewgill是的,我一定会处理它。这是一个内部应用程序,我没有看到我的用户群将我的按钮捣乱,如果它删除了一个解析,那么他们可以重新发送。它已添加到我的待办事项中:)
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":[]}