android获取所有端口,Android:蓝牙无法获取端口号

在Android应用中遇到蓝牙连接问题,当创建28个BluetoothSocket/BluetoothServerSockets后,所有端口被占用导致崩溃。问题在于打开和关闭应用多次后,无法再创建新的BluetoothSocket。通过不取消接受线程和调整连接过程中的资源管理,可以避免这个问题,使服务能够重新连接。此外,随机的连接丢失仍存在,但修改后的代码能确保服务正常运行。
摘要由CSDN通过智能技术生成

我在我的应用程序中使用蓝牙时遇到了问题。 似乎在创建了28个BluetoothSocket / BluetoothServerSockets之后,所有端口都被占用了。 sockets不需要同时打开,因为蓝牙已启用,它只有28个sockets。

这可以使用Android示例中提供的BluetoothChat示例重现。 只需打开和关闭应用程序15次(该应用程序每次创建2个插槽)。 在第15次,它将崩溃并将继续崩溃,直到您禁用然后重新启用蓝牙:12-06 18:43:58.177: E/BluetoothSocket(18530): bindListen, fail to get port number, exception: java.io.IOException: read failed, socket might closed, read ret: -1 12-06 18:43:58.193: E/BluetoothChatService(18530): Socket Type: Insecurelisten() failed 12-06 18:43:58.193: E/BluetoothChatService(18530): java.io.IOException: Error: -1 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:1035) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(BluetoothAdapter.java:982) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService$AcceptThread.(BluetoothChatService.java:280) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService.start(BluetoothChatService.java:119) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChat.onResume(BluetoothChat.java:131) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Activity.performResume(Activity.java:5182) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.access$600(ActivityThread.java:141) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Handler.dispatchMessage(Handler.java:99) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Looper.loop(Looper.java:137) 12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.main(ActivityThread.java:5039) 12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invokeNative(Native Method) 12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invoke(Method.java:511) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 12-06 18:43:58.193: E/BluetoothChatService(18530): at dalvik.system.NativeStart.main(Native Method)

套接字关闭后有没有办法释放端口?

我可以在我这里的设备上validation这种行为; 虽然以相同方式崩溃所需的次数因设备而异(我认为Galaxy Nexus运行4.2需要20-25次),因此端口句柄的可用数量似乎有所不同。 我还可以在示例应用程序(或您的应用程序)中提供问题不是内存泄漏的信息,因为所有BluetoothSocket实例都已由Dalvik发布和关闭。 此处列出的步骤仅测试BluetoothServerSocket上的问题,因此不清楚问题是否与此特别相关,尽管似乎不太可能。

至少在我的设备上,你甚至无法再启动应用程序,直到切换蓝牙适配器的状态,所以问题肯定在堆栈连接的底层管理中。

我会提交一个错误的步骤来重现http://b.android.com ,我很乐意提出它。

最近,我不得不钻研这个解决方案。 升级Android不是一个选择。

事实certificate,如果每次建立/断开连接时不是破坏和重新创建mAcceptThread,而是保留原始实例并重新使用它。 这可以最大限度地减少错误对您的应用程序的影响。

从BluetoothChatService文件,在connected()函数中,不要取消mAcceptThread:

public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) { ... ... ... // Cancel the accept thread because we only want to connect to one device //(Rather stay listening so comment out the cancel line!!) //If necessary, use some other state to prevent a second connection. //DONT CANCEL: if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;} ... ...

在AcceptThread类中,修改run()函数中的循环:

// Listen to the server socket if we're not connected //OLD LOOP: while (mState != STATE_CONNECTED) //(Rather use STATE_NONE so the loop will only stop when the service does) while (mState != STATE_NONE)

您的代码中可能还有其他事项可以正确实现该想法。

要重新连接我在片段中的定​​时处理程序中使用:

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MainActivity.mac); // Attempt to connect to the device mChatService.connect(device, true);

为了解决“重新连接超过28次失败”的问题,我每次在失去连接时重新启动服务时都会注释:

//BluetoothChatService.this.start();

我还注释掉了套接字关闭的所有部分:

//socket.close(); //mmServerSocket.close(); //mmSocket.close(); //mSecureAcceptThread.cancel();

并为接受线程添加了一个非空检测,并且连接thead不会失败:

if(mAdapter != null) { tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID_SECURE); }else{ mAdapter = BluetoothAdapter.getDefaultAdapter(); //mState = STATE_NONE; }

if(mmServerSocket != null) { socket = mmServerSocket.accept(); }

我仍然得到随机连接丢弃,但服务重新连接,一切正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值