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

Socket prematurely closed in Bluetooth Chat example

我一直在理解 "Bluetooth Chat" example. The BluetoothChatService 的源代码包括一个线程(称为 ConnectThread),在创建套接字(本地命名为 mmSocket),如果一切顺利,调用connected方法:

connected(mmSocket, mDevice);

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

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

并包括这一行:

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

取消方法包括这段代码:

mmSocket.close();

所以 mmSocket 被关闭,并且作为连接方法的第一个参数传递的套接字也应该被关闭(因为它指的是同一个对象),当下一个代码调用:

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

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

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

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

可以看出在调用connected

之前将mConnectThread设置为null