我正在尝试为学校的项目构建一个蓝牙 - 安卓应用程序。
我对Android很新(从2天开始拿到我的手机)。我在笔记本电脑上进行了2周的Android编程试验。安装了一个带有Android x86(eeepc)的VirtualBox,这样我就可以使用笔记本电脑的BluetoothAdapter
了。仿真器不支持蓝牙,速度很慢。这是关于项目...
问题/疑问:
Bluetoothconnection有2个设备 - 连接和监听设备。听音设备有BluetoothServerSocket
,循环accept()
方法,直到accept()
返回BluetoothSocket
。
在我的情况下,accept()
方法没有返回所以我卡住了,应用程序冻结了黑屏要求mit停止应用程序或只是等待。当我将超时传递给accept()
- > accept(10000)
我在超时后得到IOException
。
听力设备:
private class AcceptThread extends Thread {
private BluetoothSocket tSocket;
private BluetoothServerSocket bss = null;
public void run() {
try {
Log.d(TAG, "erzeuge ServerSocket");
bss = BluetoothAdapter.getDefaultAdapter().listenUsingInsecureRfcommWithServiceRecord("BluetoothChatInsecure", MainActivity.BT_UUID);
Log.d(TAG, "ServerSocket OK");
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Fehler Serversocket");
}
while (true) {
Log.d(TAG, "Versuche zu akzeptieren");
try {
Log.d(TAG, "Akzeptieren Anfang");
tSocket = bss.accept(10000);
//this line is never reached
Log.d(TAG, "Akzeptieren Ende");
if (tSocket != null){
//Hier wollen wir hin!
Log.d(TAG, "Verbindung akzeptiert");
ConnectedThread conThread = new ConnectedThread(tSocket);
conThread.run();
bss.close();
break;
} else {
Log.e(TAG, "Fehler, keine Verbindung");
}
} catch (IOException e) {
Log.e(TAG, "IOException währent accept-loop");
//this exception is triggered every 10 sec, when the accept(10000) times out
e.printStackTrace();
}
}
Log.i(TAG, "Acceptthread hat fertig");
}
}
连接设备:
try {
socket = device.createInsecureRfcommSocketToServiceRecord(MainActivity.BT_UUID);
outstr = socket.getOutputStream();
instr = socket.getInputStream();
ois = new ObjectInputStream(instr);
oos = new ObjectOutputStream(outstr);
} catch (IOException e) {
e.printStackTrace();
}
我已经在stackoverflow和其他一些关于这个主题的论坛上阅读了很多线程,但我没有找到解决问题的方法。 抱歉我的英语,但我不是母语。
感谢您的帮助!
编辑:
我忘了写,我用2台设备测试应用程序。我的笔记本电脑接受循环,而我使用手机并尝试连接。
答案 0 :(得分:1)
这只是正常行为:accept()
将“等待”(阻止),直到从另一台设备建立连接。然后它返回表示该连接的套接字以进行进一步的数据传输。
如您所见,超时通过IOException
发出信号。 accept()
的契约是它永远不会返回null
但总是一个有效的套接字,或者在抛出异常时失败。
因此,jj说你应该有一个等待accept()
中的连接的专用线程是正确的。
当accept()
返回一个新套接字时,您可能希望生成另一个线程来处理该套接字上的进一步通信,而accept()
线程循环以等待下一个连接。
Nb:您无法通过accept()
关闭在IO中阻止的线程(如Thread.interrupt()
中所示),但您必须从另一个线程关闭ServerSocket
以导致{{1 “唤醒”被阻止的线程。
答案 1 :(得分:0)
今天我继续研究项目。连接设备连接失败后,我收到了IOException。 现在,在运行应用程序之前,我将设备配置为有一个套接字。
编辑:accept()现在返回一个套接字,但在询问isConnected()时它没有连接。 连接设备的插座已连接。
答案 2 :(得分:0)
我已经面对这个问题了几天。
最后,我意识到了原因:
我正在创建Thread,它接受服务器中的传入连接两次。因此,ServerSocket被创建了很多次,尽管只是第二次调用accept()方法
这导致服务器不接受任何连接!!