关于蓝牙socket 服务器端首次accept总出错!

============问题描述============

我使用蓝牙socket通信,服务器端使用socket = mmServerSocket.accept()这个语句,可是这里总是报错! 错误如下:

java.io.IOException: Not able to register SDP record for mango

at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:890)

at android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:813)

at com.card.test.receivecard$AcceptThread.<init>(receivecard.java:118)

at com.card.test.receivecard.onStart(receivecard.java:96)

at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)

at android.app.Activity.performStart(Activity.java:3797)

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1620)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

at android.app.ActivityThread.access$1500(ActivityThread.java:117)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:130)

at android.app.ActivityThread.main(ActivityThread.java:3683)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:507)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)

at dalvik.system.NativeStart.main(Native Method)

null

threadid=9: thread exiting with uncaught exception (group=0x401f6560)

ATAL EXCEPTION: Thread-10

java.lang.NullPointerException

at com.card.test.receivecard$AcceptThread.run(receivecard.java:132)

我的接收端代码片段如下:

private class AcceptThread extends Thread {

private final BluetoothServerSocket mmServerSocket;

private InputStream mmInStream;

public AcceptThread() {

final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";

UUID uuid = UUID.fromString(SPP_UUID);

BluetoothServerSocket tmp = null;

try {

tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(Name,uuid);

} catch (IOException e) {

e.printStackTrace();

}

mmServerSocket = tmp;

}

public void run() {

BluetoothSocket socket = null;

// Keep listening until exception occurs or a socket is returned

while (true) {

try {

System.out.println(mmServerSocket);//由打印信息知mmServerSocket为null

socket = mmServerSocket.accept(); //所以这里出错了

} catch (IOException e) {

e.printStackTrace();

finish();

break;

}

// If a connection was accepted

if (socket != null) {

try {

以下省略。。。

}

发送端代码片段如下:

private  class ClientThread extends Thread {

private final BluetoothSocket msocket;

private final BluetoothDevice mdevice;

final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";

UUID uuid = UUID.fromString(SPP_UUID);

public ClientThread(BluetoothDevice device) {

//建立socket连接

BluetoothSocket tmp = null;

mdevice = device;

try {

tmp = mdevice.createRfcommSocketToServiceRecord(uuid);

} catch (IOException e) { e.printStackTrace(); }

msocket = tmp;

}

public void run() {

mBluetoothAdapter.cancelDiscovery();

try {

msocket.connect();

} catch (IOException e) {

e.printStackTrace();

}

// Do work to manage the connection (in a separate thread)

try {

以下省略。。。

我这两段代码是在两个不同的activity里面写的(sendcard.activity和receivecard.activity).想要的功能是用蓝牙将名片发送出去,使用时,手机A点发送按钮,跳到sendcard.activity,手机B基本上同时点接收按钮,跳到receivecard.activity。但是问题是:几乎每次刚安装好程序,首次使用时,就会accept报错(如上文错误信息),然后多尝试几次发送接收,就能成功……

不知道我说清楚没  就是首次点接收按钮,运行到accept处,程序都会意外终止,再重新点开程序试一次就不会出错了

这样很影响用户体验……

求各位大神帮帮忙!!感激不尽!!!!

虽然剩的分不多了……

============解决方案1============

做个循环,当错误时重新执行过,直到无错误后退出循环,这个应该是UUID识别的问题。

时间: 2024-11-10 13:14:05

关于蓝牙socket 服务器端首次accept总出错!的相关文章

java socket服务器端搭建

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; public class ServerBase extends Thread { public

完整版的Socket服务器端

上次的Socket服务器端只是开胃菜,这次我们把上次的代码进行完善和追加. 窗体如下 我根据读到的资料,对代码进行了重写 并对源码进行了大量的注释,希望大家能够读懂 public partial class Form1 : Form { public Form1() { InitializeComponent(); } //代理委托 delegate void FlushSocket(); //所有代理Socket的集合 List<Socket> AgentSocketList = new L

lwip socket探秘之accept

一个基本的socket建立顺序是 Server端: socket() bind() listen() accept() recv() Client端: socket() connect() send() 本文着重介绍Server端的accept()过程. 上一篇我们已经分析了listen()过程,listen()过程新建了pcb并把它放到了tcp_listen_pcbs这个链表里. 接下来,Client端通过Server绑定的地址和端口号(通过bind绑定),给Server发包.Server收到

android--基于android平台socket服务器端实例

socket相关知识 1.什么是socket  所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或

C# Socket服务器端如何判断客户端断开

使用Socket类中的Poll方法,就可以. Socket client //假如已经创建好了,连接到服务器端得Socket的客户端对象. 我们只要client.Poll(10,SelectMode.SelectRead)判断就行了.只要返回True是.就可以认为客户端已经断开了. Poll 方法将会检查 Socket 的状态.指定 selectMode 参数的 SelectMode..::.SelectRead,可确定 Socket 是否为可读.指定 SelectMode..::.Select

Android开发之蓝牙Socket

蓝牙Server端就是通过线程来注册一个具有名称和唯一识别的UUID号的BluetoothServerSocket, 然后就一直监听Client端(BluetoothSocket)的请求,并对这些请求做出相应的处理. // 注册蓝牙Server BleutoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();//该静态方法可以获取本地的蓝牙适配器对象.通过该蓝牙适配器可以对蓝牙进行基本操作 例如 : 启动设备发现(startDi

socket 服务器端绑定的ip与客户端连接的ip疑问。

服务器端的Bind(IPEndPoint)只能绑定本机所拥有的地址,如127.0.0.1,过路由的还可以绑定你在从路由获得的地址(如192.168.1.100),直接单机拨号上网的,还可以绑定你的拨号获得的外网IP.总之就是只能绑定本机可以获得的合法IP,最重要的是服务器端提供了端口号. 客户端的Connect(IPEndPoint)连接服务器可以获得的合法IP,端口号要与服务器端提供的端口号一样.

WSAEventSelect IO复用模型

1 今天帮一学习WSAEventSelect的网友排查一个测试用服务器端recv返回0的问题,出现这个问题直观判断一般是客户端socket关闭了,可是他的代码很简单并且是本机测试,通过wireshark抓包也没有发现客户端发送了FIN分节,错误码为0,一切看起来都是正常的.正当无思路时,突然想到会不会是将recv的缓冲区长度参数给设置为0了呢,后发现果然如此,代码如下: else if(event.lNetworkEvents & FD_READ) // 处理FD_READ通知消息 { if(e

Android 实现蓝牙客户端与服务器端通信

一.首先说明:蓝牙通信必须用手机测试,因为avd里没有相关的硬件,会报错! 好了,看看最后的效果图: 二.概述: 1.判断是否支持Bluetooth BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothAdapter == null) { //the device doesn't support bluetooth } else { //the device support b