3

我正在尝试为学校的一个项目构建一个小蓝牙-Android-App。

我对 Android 很陌生(从 2 天起就拿到了我的手机)。两周以来,我一直在笔记本电脑上使用 android 编程进行试验。安装了一个带有 Android x86 (eeepc) 的 VirtualBox,这样我就可以使用BluetoothAdapter笔记本电脑了。模拟器不支持蓝牙,速度很慢。那是关于项目...

问题/问题:蓝牙连接有 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 台设备测试了这个应用程序。我的笔记本电脑确实接受循环,而我使用手机并尝试连接。

4

4 回答 4

1

这只是正常行为:accept()将“等待”(阻塞)直到从另一个设备建立连接。然后它返回代表该连接的套接字以进行进一步的数据传输。

如您所见,超时是通过IOException. 的约定accept()是它永远不会返回null但始终是一个有效的套接字,或者失败并抛出异常。

因此,thejh 说您应该有一个专用线程来等待accept().
accept()返回一个新的套接字时,您可能希望生成另一个线程来处理该套接字上的进一步通信,同时accept()线程循环以等待下一个连接。

注意:您不能通过 关闭在 IO 中阻塞的线程(如accept()Thread.interrupt(),但您必须关闭ServerSocket来自另一个线程的线程IOException才能“唤醒”被阻塞的线程。

于 2013-03-31T20:48:19.763 回答
1

在显示的代码中,您似乎没有socket.connect()从客户端调用。

于 2018-03-04T11:21:32.933 回答
0

我已经面临这个问题几天了。
最后,我意识到了原因:我在服务器中创建了两次接受传入连接的线程。因此,虽然只是第二次调用了 accept() 方法,但 ServerSocket 被多次创建。
这导致服务器不接受任何连接!!

于 2014-08-01T07:40:51.157 回答
0

今天我继续做项目。从连接设备连接()失败后,我得到了 IOException。现在,在运行应用程序之前将它们配对后,我管理这些设备以拥有一个套接字。

编辑:accept() 现在返回一个套接字,但是当用 isConnected() 询问时它没有连接。连接设备的插座已连接。

于 2013-04-01T13:09:10.380 回答