蓝牙聊天示例中的套接字过早关闭
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
我认为这是错误的,因为套接字现在已关闭,我无法对其进行任何操作(例如在与套接字关联的 InputStream
或 OutputStream
上读取或写入数据).我错了吗?
您可以看到,在 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
我一直在理解 "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
我认为这是错误的,因为套接字现在已关闭,我无法对其进行任何操作(例如在与套接字关联的 InputStream
或 OutputStream
上读取或写入数据).我错了吗?
您可以看到,在 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