android 蓝牙 即时通信客户…

来源:互联网 发布:数据新闻发展趋势 编辑:程序博客网 时间:2024/06/06 14:20
原文地址:蓝牙 即时通信客户端 开发笔记">android 蓝牙 即时通信客户端 开发笔记作者: 老穆

自己在做毕设; 基于android的蓝牙即时聊天软件时,遇到的各种问题 先总结于下:

 

 

1。比较好而简单的通信方式是,通过界面配置,指定一个手机端作为server端,而一个手机作为client端,在他们真正建立起连接之后,其实双方都是互相持有对方的socket所以,无论谁是server,谁是client问题都不大(目前仅仅支持单聊)。

2.在server端,启动一个新线程accept可能接入的client,核心代码:

private class AcceptThread extends Thread {
  private finalBluetoothServerSocket mmServerSocket;
  BluetoothSocket socket =null;

  public AcceptThread(){
   BluetoothServerSockettmp = null;
   try {
    tmp= _bluetoothAdapter.listenUsingRfcommWithServiceRecord(
      mBlueToothName,mUUID);
   } catch(IOException e) {
    e.printStackTrace();
   }
   mmServerSocket= tmp;
   if (tmp !=null) {
    Toast.makeText(getApplicationContext(),
      "Serverstart successfully", 0).show();
   } else{
    Toast.makeText(getApplicationContext(),"Server start failed",
      0).show();
   }
  }

  public void run() {
   Looper.prepare();
   while (true){
    try{
     socket= mmServerSocket.accept();
     //startSocketServer();
     SocketQueue.add(socket);
     QueueLength= SocketQueue.size();
     //将socket传递给一个工作线程去处理
     SocketWorkerThreadmWorker = new SocketWorkerThread(socket);
    // mWorker.run();
    }catch (IOException e) {
     e.printStackTrace();
     break;
    }
   }
  }

  
  public void cancel() {
   try {
    mmServerSocket.close();
   } catch(IOException e) {
   }
  }

 }

 

 

-----------------------------------------------------------------------------------

在client端,用同样的UUID去发起请求连接,核心代码:

protected void connect(BluetoothDevice device) {
  BluetoothSocket mmSocket =null;
  try {
   mmSocket =device.createRfcommSocketToServiceRecord(mUUID);
   mmSocket.connect();
   StringserverAddress = mmSocket.getRemoteDevice().getAddress();
   newOutputStreamWriter(mmSocket.getOutputStream()).write("i am paipain from client");
   
  } catch (IOExceptionconnectException) {
   try {
    mmSocket.close();
   } catch(IOException closeException) {
    closeException.printStackTrace();
   }
  }
  
 }

 

----------------------------------------------------------------------------------------------

(全文默认手机A是server,B是client)

此处,在debug时候,总是在B第一次向a请求时,a可以获得信息的同时,Toast一个“a clientlinked”,如下图:[转载]android <wbr>蓝牙 <wbr>即时通信客户端 <wbr>开发笔记

,但是我在手机B中再次点击发起连接时,A中不会再次显示次Toast,也就是说没有再建立出一个新的socket,头开始我总以为是我代码哪里写的有问题,以为是多线程哪里出错了,后来玩了一把dota后恍然大悟,因为我是拿同一个mac地址去发起请求的,所以server端不会新建立起一个socket连接,所以接下来,需要做的是淡出一个新dialog,或者是进入一个新Activity,server和 client 开始通信即可.(目前0.0.1版本,只支持固定server固定client端,单聊模式)。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 平板电脑显示ipad已停用怎么办 违章车型与实际车型不符怎么办 网购与实物不符怎么办 内网ip地址丢失怎么办 转账户名写错了怎么办 工资卡开户写错公司名称怎么办 商标跟别人重了怎么办 不受信任的应用打不开怎么办 oppo手机安全证书过期怎么办 网站安全证书有问题怎么办 公章圆圈摔坏了怎么办 高风险办税人员怎么办 公司因担保被起诉怎么办 借公司钱被起诉怎么办 qq群管理员满了怎么办 微信公众号搜索不到怎么办 微信名字改不了怎么办 微信号第一次限制登录怎么办 微信第一次限制登录怎么办 老板不回我微信怎么办 微信号换手机号了怎么办 电话被对方拉黑怎么办 微信被好友拉黑了怎么办 微信收藏删了怎么办 如果忘记支付宝登录手机号码怎么办 支付宝登录密码忘记了怎么办 支付宝账户名忘记了怎么办 搜索qq号搜不到怎么办 微信号手机号码换了怎么办 起诉以后没有被告人住址怎么办 农村老人走丢了怎么办 读在职博士工作单位不支持怎么办 两证合一后国税怎么办 杭州的发票丢了怎么办 小车登记证丢了怎么办 个体户地税逾期未申报怎么办 公司社保本丢了怎么办 社保红本子掉了怎么办 三证合一后逾期怎么办 个体执照没办国税地税怎么办 丰巢APP注册没工牌号怎么办