2012-07-12 148 views
1

现在我已经建立了与我的桌面服务器的Socket连接。一般来说它工作正常,我试图找到任何剩余的错误。我无法解决的一个问题是当我发送“发送”按钮时。有时它会将意图分开发送的消息合并成一条消息。我很确定这是一个Android问题,而不是我的服务器的问题。这里是一个例子(从服务器输出控制台):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而不是BluetoothSocket时才会合并消息的问题。并不是说我不认为蓝牙插槽可能会有足够的差距来组合,但是这里的流量很少。有什么方法可以确保我的数据包在发送时不会被合并?我浏览过Socket选项,不知道要寻找什么。下面是我如何发送一个例子,很基本的:

mmDataOut.write(buffer);

哪里mmDataOut只是一个DataOutputStreambufferbyte[]

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

回答

5

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

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

+0

我有一种感觉,这是由于TCP。我正在使用的解析器无法处理它,所以我可以在解析之前手动遍历字符串以检查重复的JSON消息。现在,我只会抓住错误而忽略解析。谢谢。 – 2012-07-12 23:46:04

+0

你真的应该重新装配成完整的东西。如果性能不是特别关注的话,一次读取一个字符直到找到终止条件很容易。 – 2012-07-12 23:50:20

+0

@Atlos:虽然解析器可能无法处理部分或组合消息(这很好),但仍然有责任将消息拆分为解析器*可以处理的内容。如果因为给解析器不可分析的输入而随机丢弃了消息,那么您的通信将变得不可靠和片断。 – 2012-07-12 23:50:54