1、BlueToothMIDlet类

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class BlueToothMIDlet extends MIDlet implements CommandListener {

private static BlueToothMIDlet instance;

private BlueToothClient blueClientBox = null; // 客户端实例

private BlueToothServer blueServerBox = null; // 服务端实例

private List list = null; // 列表实例

public BlueToothMIDlet() {

instance = this;

}

public void startApp() {

list = new List("蓝牙聊天实例", List.IMPLICIT);

list.append("客户端", null);

list.append("服务端", null);

list.setCommandListener(this);

Display.getDisplay(this).setCurrent(list);

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

public static void quitApp() {

instance.destroyApp(true);

instance.notifyDestroyed();

instance = null;

}

public void commandAction(Command command, Displayable displayable) {

if (command == List.SELECT_COMMAND) {

if (list.getSelectedIndex() == 0) { // 运行客户端

blueClientBox = new BlueToothClient();

Display.getDisplay(this).setCurrent(blueClientBox);

} else if (list.getSelectedIndex() == 1) { // 运行服务端

blueServerBox = new BlueToothServer();

Display.getDisplay(this).setCurrent(blueServerBox);

}

}

}

}

2、BlueToothServer类

import javax.microedition.lcdui.*;

import javax.bluetooth.LocalDevice;

import javax.bluetooth.ServiceRecord;

import javax.microedition.io.StreamConnectionNotifier;

import javax.bluetooth.*;

import javax.microedition.io.Connector;

import java.io.*;

import java.util.Vector;

/**

* 设置一个蓝牙服务器

* 要设置一个能提供消费服务的蓝牙服务器,将有四个主要步骤:

* 1.创建一个你想要提供的可消费服务的服务记录,

* 2.增加一个新的服务记录到服务发现数据库,

* 3.注册服务。

* 4.等候客户端的引入连接。

* 两个有重要意义的相关操作:

* 1.修改服务记录,如果服务属性能使客户端可视需要改变;

* 2.当所有的都做了,从SDDB移除服务记录。

*/

public class BlueToothServer extends MyForm implements Runnable, CommandListener {

// 本地设备类实例

private LocalDevice localDevice = null;

// 服务记录实例

private ServiceRecord serviceRecord = null;

// 服务通告实例

private StreamConnectionNotifier notifier = null;

// 蓝牙服务url

private String url = "btspp://localhost:F0E0D0C0B0A000908070605040302010;name=BTServer;authorize=false";

private SenderMSG sender;

// 连接容器

public Vector connect = null;

public BlueToothServer() {

super("服务器端");

sender = new SenderMSG(this);

this.addCommand(comBack);

this.append(stringItem);

this.setCommandListener(this);

connect = new Vector();

new Thread(this).start();

}

public void commandAction(Command command, Displayable displayable) {

if (command.getCommandType() == Command.EXIT) {

sender.clear();

BlueToothMIDlet.quitApp();

} else if (command.getCommandType() == Command.OK) {

sender.blSend = true;

Thread fetchThread = new Thread() {

public void run() {

sender.sendMessage();

}

};

fetchThread.start();

}

}

public void run() {

try {

// 得到本地设备

this.localDevice = LocalDevice.getLocalDevice();

this.localDevice.setDiscoverable(DiscoveryAgent.GIAC);

} catch (BluetoothStateException ex) {

ex.printStackTrace();

}

try {

// 获得客户端连接通告

notifier = (StreamConnectionNotifier) Connector.open(this.url);

stringItem.setText("初始化成功等待连接!");

} catch (IOException ex1) {

ex1.printStackTrace();

}

// 获得服务记录

serviceRecord = localDevice.getRecord(notifier);

try {

// 从通告获得远端蓝牙设备的连接

sender.streamConnection = notifier.acceptAndOpen();

sender.init();

this.append(textField);

this.addCommand(comOk);

stringItem.setText("连接成功!");

} catch (IOException ex2) {

ex2.printStackTrace();

}

while (true) {

if (sender.blSend) {

try {

synchronized (this) {

wait();

}

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

sender.receiveMessage();

}

}

}

3、BlueToothClient类

import javax.microedition.lcdui.*;

import javax.bluetooth.*;

import java.util.Vector;

import javax.microedition.io.*;

import java.io.*;

public class BlueToothClient extends MyForm implements Runnable, CommandListener,DiscoveryListener

{

//设备发现代理

private DiscoveryAgent discoverAgent = null;

//本地蓝牙设备实例

private LocalDevice localDevice = null;

//远端设备实例

private RemoteDevice remoteDevice = null;

//全球唯一标识符

private UUID[] uuid = null;

//服务记录实例

private ServiceRecord serviceRecord = null;

//设备容器

private Vector device = null;

//服务容器

private Vector service = null;

private SenderMSG sender;

//用于蓝牙连接的url

private String url = null;

public BlueToothClient()

{

super("客户端");

sender = new SenderMSG(this);

this.append(stringItem);

this.append(textField);

this.addCommand(comOk);

this.addCommand(comBack);

this.setCommandListener(this);

this.device = new Vector();

this.service = new Vector();

new Thread(this).start();

}

public void commandAction(Command command, Displayable displayable)

{

if (command.getCommandType() == Command.EXIT)

{

sender.clear();

discoverAgent.cancelInquiry(this);

discoverAgent.cancelServiceSearch(0);

BlueToothMIDlet.quitApp();

}

else if(command.getCommandType() == Command.OK)

{

sender.blSend = true;

Thread fetchThread = new Thread()

{

public void run()

{

//发送消息

sender.sendMessage();

}

};

fetchThread.start();

}

}

public void run()

{

//midp2.0进度条(持续动画状态)

Gauge gauge = new Gauge(null,false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);

this.append(gauge);

//开始搜索服务端蓝牙设备

stringItem.setText("开始搜索蓝牙设备...");

startSearchDevices();

try

{

synchronized(this)

{

wait();

}

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

stringItem.setText("共找到:"+device.size()+"个蓝牙设备开始搜索服务...");

//开始搜索远端设备提供的服务

startSearchServices();

try

{

synchronized(this)

{

wait();

}

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

stringItem.setText("共找到:"+service.size()+"个服务开始发送信息。");

url = serviceRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);

try

{

sender.streamConnection = (StreamConnection)Connector.open(url);

sender.init();

}

catch (IOException ex1)

{

ex1.printStackTrace();

}

//删除进度条

this.delete(2);

while(true)

{

if(sender.blSend)

{

try

{

synchronized(this)

{

wait();

}

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

}

sender.receiveMessage();

}

}

/**

* 蓝牙设备发现

*/

private void startSearchDevices()

{

try

{

//获得本地设备

localDevice = LocalDevice.getLocalDevice();

//获得发现代理

discoverAgent = localDevice.getDiscoveryAgent();

discoverAgent.startInquiry(DiscoveryAgent.GIAC,this);

}

catch (BluetoothStateException ex)

{

ex.printStackTrace();

}

}

/**

* 远端设备服务发现

*/

private void startSearchServices()

{

uuid = new UUID[2];

uuid[0] = new UUID(0x1101);

uuid[1] = new UUID("F0E0D0C0B0A000908070605040302010",false);

for(int i = 0; i<device.size(); i++)

{//取出已经搜到的远端设备

remoteDevice = (RemoteDevice)device.elementAt(i);

try

{//搜索该设备上的服务

discoverAgent.searchServices(null, uuid, remoteDevice, this);

}

catch (BluetoothStateException ex)

{

ex.printStackTrace();

}

}

}

/**

* 设备发现过程中的回调(用来查找每一个可用的设备)

* @param remoteDevice RemoteDevice

* @param deviceClass DeviceClass

*/

public void deviceDiscovered(RemoteDevice remoteDevice,DeviceClass deviceClass)

{

if(device.indexOf(remoteDevice) == -1)

{

device.addElement(remoteDevice);

}

}

/**

* 设备发现完成回调(用来标识设备查找是否完成)

* @param _int int

*/

public void inquiryCompleted(int _int)

{

synchronized (this)

{

notify();

}

}

/**

* 服务发现回调(用来发现远端设备上的可用服务)

* @param _int int

* @param serviceRecordArray ServiceRecord[]

*/

public void servicesDiscovered(int _int, ServiceRecord[] serviceRecordArray)

{

for (int i = 0; i < serviceRecordArray.length; i++)

{

service.addElement(serviceRecordArray[i]);

serviceRecord = serviceRecordArray[i];

}

}

/**

* 服务发现回调(用来标识服务搜索是否完成)

* @param _int int

* @param _int1 int

*/

public void serviceSearchCompleted(int _int, int _int1)

{

synchronized (this)

{

notify();

}

}

}

5、 MyForm类

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.StringItem;

import javax.microedition.lcdui.TextField;

public class MyForm extends Form {

// 发送按钮

public Command comOk = null;

// 返回按钮

public Command comBack = null;

public TextField textField = null;

public StringItem stringItem = null;

public MyForm(String title) {

super(title);

comOk = new Command("发送", Command.OK, 1);

comBack = new Command("退出", Command.EXIT, 2);

}

}

6、 SenderMSG类

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import javax.microedition.io.StreamConnection;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.StringItem;

import javax.microedition.lcdui.TextField;

public class SenderMSG {

// 连接实例

public StreamConnection streamConnection = null;

// 输出数据流

private DataOutputStream dataOutputStream = null;

// 输入数据流

private DataInputStream dataInputStream = null;

//接收阻塞标记

public boolean blSend = false;

private MyForm form;

public SenderMSG(Form f){

form = (MyForm)f;

form.textField = new TextField("输入:", "", 50, TextField.ANY);

form.stringItem = new StringItem("反馈:", "");

}

public void init(){

try {

dataOutputStream = streamConnection.openDataOutputStream();

dataInputStream = streamConnection.openDataInputStream();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 发送消息

*/

public void sendMessage() {

String text = form.textField.getString();

//       System.out.println("send text="+text);

if(text==null||text.length()==0)

return;

try {

dataOutputStream.write(text.getBytes());

dataOutputStream.write("/r/n".getBytes());

} catch (IOException ex) {

ex.printStackTrace();

}

blSend = false;

synchronized (this) {

notify();

}

}

/**

* 接受消息

* @return

*/

public boolean receiveMessage() {

try {

if (streamConnection!=null&&dataInputStream != null) {

StringBuffer sb = new StringBuffer();

int c = 0;

while (((c = dataInputStream.read()) != '/n') && (c != -1)) {

sb.append((char) c);

}

//                System.out.println("receive text="+sb.toString());

String text = sb.toString();

if(text==null||text.length()==0){

clear();

form.stringItem.setText("与对方失去连接!");

form.removeCommand(form.comOk);

form.delete(1);

}

else

form.stringItem.setText(sb.toString());

}

} catch (IOException ex) {

ex.printStackTrace();

return false;

}

return true;

}

/**

* 断开连接

*/

public void clear() {

try {

if(dataOutputStream!=null){

dataOutputStream.close();

dataOutputStream=null;

}

if(dataInputStream!=null){

dataInputStream.close();

dataInputStream=null;

}

if(streamConnection!=null){

streamConnection.close();

streamConnection=null;

}

} catch (IOException ex) {

ex.printStackTrace();

}

}

}

一个简单的手机蓝牙聊天程序的源码相关推荐

  1. 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?

    历史溯源 由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP.FTP.POP3.SMTP.Telnet等.早期操作系统UNIX( ...

  2. 一个简单的Java计时器项目,附源码

    学Java开发的小伙伴都会想着做一些项目来检验自己的学习成果,今天小千就来分享一个简单的Java计时器项目,源码也放在文中,大家可以参考一下. Java计时器项目 开发环境:win8+eclipse+ ...

  3. 微信/易信公共平台开发(一):开发了一个简单易用的PHP类(提供源码),十几行代码搞定一个公众号

    这两天学习了一下微信公共平台和易信公共平台的开发 (易信与微信协议是基本一样的)(PS:没听说过易信?你out了?) 公共平台开发原理这里就不讲了,如果是初次接触的同学,建议先看 David_Tang ...

  4. android编程语言如何实现一个简单的手机打电话应用程序

    2019独角兽企业重金招聘Python工程师标准>>> 手机打电话是最常用的功能了,用Android手机开发当中打电话的功能是怎样实现的呢?我来看下简单的拨打电话的代码实例: And ...

  5. 在线报名竞赛网站java源码_我用Java写出了一个QQ!可在线聊天(附源码)~

    来源:blog.csdn.net/weixin_44048140 正文如下: 一. 功能实现 1.修改功能(密码.昵称.个性签名) 2.添加好友.删除好友 3.单聊功能 4.判断好友是否在线 二. 模 ...

  6. 发布一个很COOL的图片验证码程序[含源码]

    一.先看看效果: 制作步骤: (1)准备你想要的多张图片(数量不限,由你自己决定),将它们放在一个统一的目录下,比如我这里是"ValidateCodeImg".图片尺寸尽量适合你的 ...

  7. python推荐系统酒店_PCA实现一个简单的酒店推荐系统(附Python源码)

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第二 [Python]:排名第三 [算法]:排名第四 PCA前言 众所周知,PCA 的主要目的是降维,同时也可以起到分 ...

  8. 网站页面增加一个简单的密码登录访问php网站源码

    简介: 网站内容保护php源码,需要输入正确密码才能访问 密码在index.php里面进行修改 .写的有注释! 网盘下载地址: http://kekewangLuo.cc/Q4WceC1Arvq0 图 ...

  9. 【QT学习】制作一个简单的图片查看器(完整源码)

最新文章

  1. oracle 复制表方法,(转)oracle数据库之间 表复制方法一(extent 方法)
  2. 页面上一些小icon的制作方法及技术选择
  3. 10 种机器学习算法的要点(附 Python 和 R 代码)(转载)
  4. 《转》Python学习(16)-python异常
  5. C#可空类型(Nullable Types)
  6. Redis中的Lua 脚本
  7. CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
  8. win10卓越性能模式,提升电脑性能
  9. 别被忽悠了!阿里内部人士:我们正悄悄地拆掉中台,你还在建?
  10. 剑指offer——面试题32:从1到n整数中1出现的次数
  11. 消息服务器mq集群出现假死,排查tomcat项目假死原因的简单方法
  12. 双人贪吃蛇小游戏C++原创
  13. 036--python--摇骰子游戏
  14. 干货 || 详解SMT贴片电感与SMT贴片电容的区别
  15. 中医药大学计算机考试题,浙江中医药大学2013年级研究生《计算机应用》期末考试复习题...
  16. wps打印缩放到一页_WPS文档过长时,如何在A4纸上完美打印
  17. kivy中on_press,on_release事件用代码设置函数的问题
  18. Hystrix断路器详解
  19. 模板测试+一个好玩的顶点动画效果——UnityShader学习笔记
  20. 计算机基本配置监测表,无敌教学贴!关于Garmin腕表基本操作 看这一篇就够了...

热门文章

  1. 阿里新推出「瓴羊DaaS」,有没有前途?
  2. python manager ulimit_linux 设置系统ulimit
  3. 【单曲循环】起风了:从前初识这世间,如今走过这世间
  4. java的setvisible_Java Container.setVisible方法代码示例
  5. Ubuntu为应用程序Anaconda、PyCharm等程序创建桌面快捷方
  6. 《Linux运维总结:firewalld防火墙使用教程》
  7. 关于树叶的活动设计_幼儿园大班主题活动《叶子》教案设计
  8. 网络访问之HttpURLConnection
  9. 图算法(二十五):子图匹配(Subgraph Matching)【基本的图查询操作,意在发掘图重要的子结构】【适用场景:社交网络分析、群体发现、异常检测】【在一个给定的大图里找到与给定小图同构的子图】
  10. 微信小程序——如何解决本地图片不显示的问题