为什么Android蓝牙套接字一直在读取相同的消息?

为什么Android蓝牙套接字一直在读取相同的消息?,android,networking,bluetooth,Android,Networking,Bluetooth,我正在编写一个使用androids BluethoothSocket类和BluetoothServerSocket的应用程序。目前,我正在使用两台设备进行测试,一台是服务器,另一台是客户端,我正在尝试实现我的应用程序特定消息,它们的格式如下 [1byte MessageType][2byte整封邮件的长度][1byte clientID][XXXbytes任何特定于此邮件的数据] 因此,上面的“头”部分是im从套接字解析的内容,以查看我应该如何解释我收到的内容。问题是我连续多次收到相同的消息。除

我正在编写一个使用androids BluethoothSocket类和BluetoothServerSocket的应用程序。目前,我正在使用两台设备进行测试,一台是服务器,另一台是客户端,我正在尝试实现我的应用程序特定消息,它们的格式如下

[1byte MessageType][2byte整封邮件的长度][1byte clientID][XXXbytes任何特定于此邮件的数据]

因此,上面的“头”部分是im从套接字解析的内容,以查看我应该如何解释我收到的内容。问题是我连续多次收到相同的消息。除非我在某个地方遗漏了逻辑,否则我不认为是我的应用程序发送了这么多次。它基于一个请求/响应周期,所以它实际上只应该在某个动作被触发时发生。比如说,

用户连接
服务器->发送客户端他的ID
客户端->发送响应(我收到你的消息。服务器可以停止发送)

我是否遗漏了BluetoothSocket类的任何细微差别,或者仅仅是基本的网络协议?看起来套接字似乎在一遍又一遍地读取同一条消息,即使它没有被发送。我的服务器读取功能如下所示:

byte[] buffer = new byte[BTUtils.MAX_SOCKET_READ]; // byte[2048]
        int bytes;
        // Keep listening to the InputStream while connected
        while (m_state == BTStates.STATE_CONNECTED) {
            try {
                // Read from the InputStream
                bytes = m_inputStream.read(buffer);
                // Send the obtained bytes to the UI Activity
                m_uiHandler.obtainMessage(BTMessages.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                disconnectClient(m_clientId);
                break;
            }
        }

伙计们,在谷歌搜索和查看堆栈溢出后,我在这里找到了我的答案:

我以前见过人们在使用蓝牙聊天示例时遇到这种问题。示例代码的问题在于,发送给处理程序的消息对象只包含对每个后续read()操作所使用的实际字节[]数组的引用。这意味着,一旦处理程序获得消息并开始检查阵列,Bluetooth套接字上的后续read()操作就已经有机会将较新的数据写入该阵列


尽管那篇文章的OP有2个字节来自他的流,但它看起来像是一个类似于我所经历的问题,有时这些消息会变得杂乱无章,看起来很奇怪。我实际上要研究一个循环缓冲区解决方案,因为我认为最终我会需要它。但如果你不熟悉蓝牙技术(像我一样),未来的海报会小心使用蓝牙示例

您正在忽略流的末尾。如果
read()
返回-1,则表示对等方已断开连接;缓冲区中没有数据;您应该关闭插座。@EJP谢谢。我可能应该处理read函数的-1返回,但这听起来并没有真正解决我的问题。事实上,这几乎是相反的,我实际上反复从read函数中获取有效的字节计数,这是一个注释而不是答案。你确定客户端没有发送>1条消息吗?@EJP我实际上发布了一个对我有用的答案。我正在处理一个缓冲区,该缓冲区与套接字读取到的缓冲区相同,这导致了问题。我修改了代码,用套接字复制了接收到的字节数组,现在正在处理,我的问题就消失了。