BluetoothServerSocket不从accept()返回

问题描述 投票:3回答:4

我正在尝试为学校的项目构建一个小型的蓝牙 - Android应用程序。

我对Android很新(从2天开始拿到我的手机)。我在笔记本电脑上进行了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台设备测试应用程序。我的笔记本电脑接受循环,而我使用手机并尝试连接。

java android sockets bluetooth serversocket
4个回答
1
投票

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

如您所见,超时通过IOException发出信号。 accept()的合同是它永远不会返回null但总是一个有效的套接字,或者在抛出异常时失败。

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

N.b。:你不能通过accept()关闭IO中阻塞的线程(如在Thread.interrupt()中),但你必须从另一个线程关闭ServerSocket以使IOException'唤醒'被阻塞的线程。


1
投票

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


0
投票

今天我继续研究项目。连接设备连接失败后,我收到了IOException。现在,在运行应用程序之前,我将设备配置为套接字。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.