蓝牙聊天示例中的套接字过早关闭

时间:2015-03-12 11:58:52

标签: java android sockets bluetooth android-bluetooth

我一直在理解"Bluetooth Chat" example的源代码。 BluetoothChatService包含一个Thread(称为 ConnectThread ),它在创建套接字(本地名称为 mmSocket )之后,如果一切顺利,则调用< em>已连接方法:

connected(mmSocket, mDevice);

因此, mmSocket 作为参数传递。连接方法具有以下签名:

public synchronized void connected(BluetoothSocket socket, BluetoothDevice device);

并包含以下一行:

mConnectThread.cancel(); //mConnetcThread is an instance of ConnectThread

cancel 方法包含以下代码:

mmSocket.close();

因此关闭 mmSocket ,并且作为连接方法shuold的第一个参数传递的套接字被关闭(因为它引用同一个对象),并且当下一个代码调用时:

mConnectedThread = newConnectedThread(socket); // socket should be already closed

我认为这是错误的,因为套接字现在已关闭,我无法对其进行任何操作(例如读取或写入与套接字关联的InputStreamOutputStream上的数据)。我错了吗?

1 个答案:

答案 0 :(得分:1)

您可以在mConnectThread方法中取消connected之前检查到它是否为空。同时,这是从第434行开始的connected的完整调用:

 // Reset the ConnectThread because we're done
 synchronized (BluetoothChatService.this) {
     mConnectThread = null;
 }
 // Start the connected thread
 connected(mmSocket, mmDevice);

可以看出,mConnectThread在调用connected

之前设置为null