《J2ME蓝牙实战入门》的源代码来自互联网.docx
《《J2ME蓝牙实战入门》的源代码来自互联网.docx》由会员分享,可在线阅读,更多相关《《J2ME蓝牙实战入门》的源代码来自互联网.docx(18页珍藏版)》请在冰豆网上搜索。
《J2ME蓝牙实战入门》的源代码来自互联网
下面附上《J2ME蓝牙实战入门》的源代码(分为三个文件):
StupidBTMIDlet.java
importjavax.microedition.lcdui.Alert;
importjavax.microedition.lcdui.AlertType;
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Display;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.List;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
/**
*@authorJagie
*
*MIDlet
*/
publicclassStupidBTMIDletextendsMIDletimplementsCommandListener
{
Listlist;
ServerBoxsb;
ClientBoxcb;
/*
*(non-Javadoc)
*
*@seejavax.microedition.midlet.MIDlet#startApp()
*/
protectedvoidstartApp()throwsMIDletStateChangeException
{
list=newList("傻瓜蓝牙入门",List.IMPLICIT);
list.append("Client",null);
list.append("Server",null);
list.setCommandListener(this);
Display.getDisplay(this).setCurrent(list);
}
/**
*debug方法
*
*@params
* 要显示的字串
*/
publicvoidshowString(Strings)
{
Displayabledp=Display.getDisplay(this).getCurrent();
Alertal=newAlert(null,s,null,AlertType.INFO);
al.setTimeout(2000);
Display.getDisplay(this).setCurrent(al,dp);
}
/**
*显示主菜单
*
*/
publicvoidshowMainMenu()
{
Display.getDisplay(this).setCurrent(list);
}
protectedvoidpauseApp()
{
//TODOAuto-generatedmethodstub
}
publicvoidcommandAction(Commandcom,Displayabledisp)
{
if(com==List.SELECT_COMMAND)
{
Listlist=(List)disp;
intindex=list.getSelectedIndex();
if(index==1)
{
if(sb==null)
{
sb=newServerBox(this);
}
sb.setString(null);
Display.getDisplay(this).setCurrent(sb);
}
else
{
//每次都生成新的客户端实例
cb=null;
System.gc();
cb=newClientBox(this);
Display.getDisplay(this).setCurrent(cb);
}
}
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException
{
//TODOAuto-generatedmethodstub
}
}
/////////////////////////////////////////////////////////////
//服务端
ServerBox.java
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.util.Vector;
importjavax.bluetooth.DiscoveryAgent;
importjavax.bluetooth.LocalDevice;
importjavax.bluetooth.ServiceRecord;
importjavax.bluetooth.UUID;
importjavax.microedition.io.Connector;
importjavax.microedition.io.StreamConnection;
importjavax.microedition.io.StreamConnectionNotifier;
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.TextBox;
importjavax.microedition.lcdui.TextField;
/**
*服务端GUI
*
*@authorJagie
*
*TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-
*Preferences-Java-Codestyle-CodeTemplates
*/
publicclassServerBoxextendsTextBoximplementsRunnable,CommandListener
{
Commandcom_pub=newCommand("开启服务",Command.OK,0);
Commandcom_cancel=newCommand("终止服务",Command.CANCEL,0);
Commandcom_back=newCommand("返回",Command.BACK,1);
LocalDevicelocalDevice;
StreamConnectionNotifiernotifier;
ServiceRecordrecord;
booleanisClosed;
ClientProcessorprocessor;
StupidBTMIDletmidlet;
//响应服务的uuid
privatestaticfinalUUIDECHO_SERVER_UUID=newUUID(
"F0E0D0C0B0A000908070605040302010",false);
publicServerBox(StupidBTMIDletmidlet)
{
super(null,"",500,TextField.ANY);
this.midlet=midlet;
this.addCommand(com_pub);
this.addCommand(com_back);
this.setCommandListener(this);
}
publicvoidrun()
{
System.out.println("hereisrun");
booleanisBTReady=false;
try
{
localDevice=LocalDevice.getLocalDevice();
System.out.println("getDevice");
if(!
localDevice.setDiscoverable(DiscoveryAgent.GIAC))
{
showInfo("无法设置设备发现模式");
return;
}
//prepareaURLtocreateanotifier
StringBufferurl=newStringBuffer("btspp:
//");
//indicatethisisaserver
url.append("localhost").append(':
');
//addtheUUIDtoidentifythisservice
url.append(ECHO_SERVER_UUID.toString());
//addthenameforourservice
url.append(";name=EchoServer");
//requestalloftheclientnottobeauthorized
//somedevicesfailonauthorize=true
url.append(";authorize=false");
//createnotifiernow
notifier=(StreamConnectionNotifier)Connector
.open(url.toString());
record=localDevice.getRecord(notifier);
//rememberwe'vereachedthispoint.
isBTReady=true;
}
catch(Exceptione)
{
e.printStackTrace();
}
//nothingtodoifnobluetoothavailable
if(isBTReady)
{
showInfo("初始化成功,等待连接");
this.removeCommand(com_pub);
this.addCommand(com_cancel);
}
else
{
showInfo("初始化失败,退出");
return;
}
//生成服务端服务线程对象
processor=newClientProcessor();
//ok,startacceptingconnectionsthen
while(!
isClosed)
{
StreamConnectionconn=null;
try
{
conn=notifier.acceptAndOpen();
}
catch(IOExceptione)
{
//wrongclientorinterrupted-continueanyway
continue;
}
processor.addConnection(conn);
}
}
publicvoidpublish()
{
isClosed=false;
this.setString("waitingyouraccept");
System.out.println("befoutstart");
newThread(this).start();
System.out.println("endstart");
}
publicvoidcancelService()
{
isClosed=true;
showInfo("服务终止");
this.removeCommand(com_cancel);
this.addCommand(com_pub);
}
/*
*(non-Javadoc)
*
*@seejavax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command,
* javax.microedition.lcdui.Displayable)
*/
publicvoidcommandAction(Commandarg0,Displayablearg1)
{
if(arg0==com_pub)
{
//发布service
publish();
}
else
if(arg0==com_cancel)
{
cancelService();
}
else
{
cancelService();
midlet.showMainMenu();
}
}
/**
*内部类,服务端服务线程。
*
*@authorJagie
*
*TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-
*Preferences-Java-Codestyle-CodeTemplates
*/
privateclassClientProcessorimplementsRunnable
{
privateThreadprocessorThread;
privateVectorqueue=newVector();
//privatebooleanisOk=true;
ClientProcessor()
{
processorThread=newThread(this);
processorThread.start();
}
publicvoidrun()
{
while(!
isClosed)
{
synchronized(this)
{
if(queue.size()==0)
{
try
{
//阻塞,直到有新客户连接
wait();
}
catch(InterruptedExceptione)
{
}
}
}
//处理连接队列
StreamConnectionconn;
synchronized(this)
{
if(isClosed)
{
return;
}
conn=(StreamConnection)queue.firstElement();
queue.removeElementAt(0);
processConnection(conn);
}
}
}
/**
*往连接队列添加新连接,同时唤醒处理线程
*
*@paramconn
*/
voidaddConnection(StreamConnectionconn)
{
synchronized(this)
{
queue.addElement(conn);
notify();
}
}
}
/**
*从StreamConnection读取输入
*
*@paramconn
*@return
*/
privateStringreadInputString(StreamConnectionconn)
{
StringinputString=null;
try
{
DataInputStreamdis=conn.openDataInputStream();
inputString=dis.readUTF();
dis.close();
}
catch(Exceptione)
{
e.printStackTrace();
}
returninputString;
}
/**
*debug
*
*@params
*/
privatevoidshowInfo(Strings)
{
StringBuffersb=newStringBuffer(this.getString());
if(sb.length()>0)
{
sb.append("\n");
}
sb.append(s);
this.setString(sb.toString());
}
/**
*处理客户端连接
*
*@paramconn
*/
privatevoidprocessConnection(StreamConnectionconn)
{
//读取输入
StringinputString=readInputString(conn);
//生成响应
StringoutputString=inputString.toUpperCase();
//输出响应
sendOutputData(outputString,conn);
try
{
conn.close();
}
catch(IOExceptione)
{
}//ignore
showInfo("客户端输入:
"+inputString+",已成功响应!
");
}
/**
*输出响应
*
*@paramoutputData
*@paramconn
*/
privatevoidsendOutputData(StringoutputData,StreamConnectionconn)
{
try
{
DataOutputStreamdos=conn.openDataOutputStream();
dos.writeUTF(outputData);
dos.close();
}
catch(IOExceptione)
{
}
}
}
//客户端
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.util.Vector;
importjavax.microedition.io.Connector;
importjavax.microedition.io.StreamConnection;
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.*;
importjavax.microedition.lcdui.Gauge;
importjavax.microedition.lcdui.StringItem;
importjavax.microedition.lcdui.TextField;
//jsr082API
importjavax.bluetooth.BluetoothStateException;
importjavax.bluetooth.DeviceClass;
importjavax.bluetooth.DiscoveryAgent;
importjavax.bluetooth.DiscoveryListener;
importjavax.bluetooth.LocalDevice;
importjavax.bluetooth.RemoteDevice;
importjavax.bluetooth.ServiceRecord;
importjavax.bluetooth.UUID;
/**
*客户端GUI
*
*@authorJagie
*
*TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-
*Preferences-Java-Codestyle-CodeTemplates
*/
publicclassClientBoxextendsFormimplementsRunnable,CommandListener,
DiscoveryListener
{
//字串输入框
TextFieldinput=newTextField(null,"",50,TextField.ANY);
//loger
StringItemresult=