/** */
/**
*
* @author 梧州学院 04计本2班 罗功武
* date: 08/02/27
*/
package chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DataElement;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.ServiceRecord;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import flat.FlatMainMIDlet;
/** */ /**
* PairChatChatRoomServer 类
* 双人聊天室的服务器类
* 新健一个双人聊天室,并等待用户的链接.
* 采用多线程的技术,服务端主线程,发送数据线程,
* 两种线程维护聊天室的运行
*/
public class PairChatRoomServer extends Form implements Runnable, CommandListener ... {
/**//*用户召娱乐妮称*/
private String userName;
/**//*客服端用户娱乐妮称*/
private String friendName;
/**//*娱乐平台主类*/
private FlatMainMIDlet flatMainMIDlet;
/**//*窗口滚动条*/
private static final Ticker ticker = new Ticker("我的聊天室,我做主^_^");
//用于输入要发送的消息
private TextField tfData = new TextField("请输入发送的消息",
"",255,TextField.ANY);
private static final Command cmdExit = new Command("退出", Command.EXIT, 0);
private static final Command cmdSend = new Command("发送", Command.SCREEN, 1);
/**//*线程运行标志*/
private boolean isRunning = true;
/**//*客户端是否退出*/
private boolean isNoExit = true;
//是否是第一次接收数据
private boolean isFirstAccept = true;
//服务链接器
StreamConnectionNotifier server = null;
//服务器服务记录
ServiceRecord record=null;
//数据输入流
private DataInputStream dis = null;
//数据输出流
private DataOutputStream dos = null;
/** *//**
* 构造方法
* 完成双人聊天室窗口的初使化
* @param midlet
* @param mainMenu
* @param name
*/
public PairChatRoomServer(FlatMainMIDlet midlet, String name) ...{
super("双人聊天室");
this.flatMainMIDlet = midlet;
this.userName = name;
setTicker(ticker);
append(tfData);
addCommand(cmdExit);
addCommand(cmdSend);
setCommandListener(this);
//开始服务器线程
new Thread(this).start();
}
/** *//**
* 处理命令按钮事件
*/
public void commandAction(Command cmd, Displayable d) ...{
if (cmd == cmdExit) ...{
/**//*发送退出信息*/
String str = "exit";
new sendThread(str).start();
isRunning = false;
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
}
close();
flatMainMIDlet.showFlatMenu();
} else if(cmd == cmdSend) ...{
String str = tfData.getString();
//显示发送的消息
insert(size()-1,new StringItem("","我说: " + str + " "));
/**//*发送数据,新建发送数据线程*/
new sendThread(str).start();
tfData.setString("");
}
}
/** *//**
* 服务器线程
*/
public void run() ...{
isRunning = true;
LocalDevice local = null;
try ...{
/**//*设置设备的发现模式,使设备处可发现*/
local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.GIAC);
} catch (BluetoothStateException e) ...{
return;
}
try ...{
/**//*开启服务*/
server = (StreamConnectionNotifier)Connector.open(
"btspp://localhost:11111111111111111111111111111111");
/**//*服务器服务记录*/
ServiceRecord record = local.getRecord(server);
/**//*自定义服务记录属性*/
DataElement elm = null;
elm = new DataElement(DataElement.STRING, userName);
record.setAttributeValue(0x1234, elm);
elm = null;
elm = new DataElement(DataElement.STRING, "SCHOLAR_II");
record.setAttributeValue(0x1235, elm);
/**//*更新服务记录属性*/
local.updateRecord(record);
} catch (IOException e) ...{
return;
}
String message = "";
/**//*循环的为客户端服务*/
while(isRunning) ...{
isNoExit = true;
isFirstAccept = true;
try ...{
local.setDiscoverable(DiscoveryAgent.GIAC);
} catch (BluetoothStateException e1) ...{
// TODO Auto-generated catch block
return;
}
StreamConnection conn = null;
try ...{
try ...{
/**//*等待客户端的链接*/
conn = server.acceptAndOpen();
/**//*客户端链接后,关闭发现模式*/
local.setDiscoverable(DiscoveryAgent.NOT_DISCOVERABLE);
} catch (IOException e) ...{
return;
}
/**//*获得输入输出流*/
dis = conn.openDataInputStream();
dos = conn.openDataOutputStream();
/**//*接收数据*/
while(isRunning&&isNoExit) ...{
/**//*等待用户发送数据*/
message = dis.readUTF();
if(isFirstAccept)
...{
/**//*第一接收客户端的数据,客户端的用户名*/
insert(size()-1,new StringItem("","^_^欢迎"
+ message + "进入我的聊天室" + " "));
friendName = message;
isFirstAccept = false;
}
else
...{ /**//*用户退出*/
if(message.equals("exit"))
...{
insert(size()-1,new StringItem("",
friendName + "退出我的聊天室" + " "));
isNoExit = false;
dos=null;
}
else
...{
insert(size()-1,new StringItem("",friendName + "说: "
+ message + " "));
}
}
/**//*线程暂停*/
Thread.sleep(1000);
}
} catch (Exception e) ...{
} finally ...{
if (conn!=null) ...{
try ...{
conn.close();
conn = null;
}catch (Exception e) ...{
}
}
}
}
close();
/**//*结束聊天*/
}
/** *//**
* 关闭连接
*/
public void close() ...{
try ...{
/**//*关闭输入流*/
if (dis != null)
...{
dis.close();
dis = null;
}
/**//*关闭输出流*/
if (dos != null)
...{
dos.close();
dos = null;
}
/**//*关闭服务器*/
if (server != null)
...{
server.close();
server = null;
}
} catch (Exception e) ...{
}
}
/**//*内部类-发送数据的线程*/
class sendThread extends Thread...{
private String data = null;
public sendThread(String data)...{
this.data = data;
}
public void run()...{
if (dos == null) ...{
return;
}
try ...{
dos.writeUTF(data);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}
} // PairChatRoomServer.java文件结束
*
* @author 梧州学院 04计本2班 罗功武
* date: 08/02/27
*/
package chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DataElement;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.ServiceRecord;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import flat.FlatMainMIDlet;
/** */ /**
* PairChatChatRoomServer 类
* 双人聊天室的服务器类
* 新健一个双人聊天室,并等待用户的链接.
* 采用多线程的技术,服务端主线程,发送数据线程,
* 两种线程维护聊天室的运行
*/
public class PairChatRoomServer extends Form implements Runnable, CommandListener ... {
/**//*用户召娱乐妮称*/
private String userName;
/**//*客服端用户娱乐妮称*/
private String friendName;
/**//*娱乐平台主类*/
private FlatMainMIDlet flatMainMIDlet;
/**//*窗口滚动条*/
private static final Ticker ticker = new Ticker("我的聊天室,我做主^_^");
//用于输入要发送的消息
private TextField tfData = new TextField("请输入发送的消息",
"",255,TextField.ANY);
private static final Command cmdExit = new Command("退出", Command.EXIT, 0);
private static final Command cmdSend = new Command("发送", Command.SCREEN, 1);
/**//*线程运行标志*/
private boolean isRunning = true;
/**//*客户端是否退出*/
private boolean isNoExit = true;
//是否是第一次接收数据
private boolean isFirstAccept = true;
//服务链接器
StreamConnectionNotifier server = null;
//服务器服务记录
ServiceRecord record=null;
//数据输入流
private DataInputStream dis = null;
//数据输出流
private DataOutputStream dos = null;
/** *//**
* 构造方法
* 完成双人聊天室窗口的初使化
* @param midlet
* @param mainMenu
* @param name
*/
public PairChatRoomServer(FlatMainMIDlet midlet, String name) ...{
super("双人聊天室");
this.flatMainMIDlet = midlet;
this.userName = name;
setTicker(ticker);
append(tfData);
addCommand(cmdExit);
addCommand(cmdSend);
setCommandListener(this);
//开始服务器线程
new Thread(this).start();
}
/** *//**
* 处理命令按钮事件
*/
public void commandAction(Command cmd, Displayable d) ...{
if (cmd == cmdExit) ...{
/**//*发送退出信息*/
String str = "exit";
new sendThread(str).start();
isRunning = false;
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
}
close();
flatMainMIDlet.showFlatMenu();
} else if(cmd == cmdSend) ...{
String str = tfData.getString();
//显示发送的消息
insert(size()-1,new StringItem("","我说: " + str + " "));
/**//*发送数据,新建发送数据线程*/
new sendThread(str).start();
tfData.setString("");
}
}
/** *//**
* 服务器线程
*/
public void run() ...{
isRunning = true;
LocalDevice local = null;
try ...{
/**//*设置设备的发现模式,使设备处可发现*/
local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.GIAC);
} catch (BluetoothStateException e) ...{
return;
}
try ...{
/**//*开启服务*/
server = (StreamConnectionNotifier)Connector.open(
"btspp://localhost:11111111111111111111111111111111");
/**//*服务器服务记录*/
ServiceRecord record = local.getRecord(server);
/**//*自定义服务记录属性*/
DataElement elm = null;
elm = new DataElement(DataElement.STRING, userName);
record.setAttributeValue(0x1234, elm);
elm = null;
elm = new DataElement(DataElement.STRING, "SCHOLAR_II");
record.setAttributeValue(0x1235, elm);
/**//*更新服务记录属性*/
local.updateRecord(record);
} catch (IOException e) ...{
return;
}
String message = "";
/**//*循环的为客户端服务*/
while(isRunning) ...{
isNoExit = true;
isFirstAccept = true;
try ...{
local.setDiscoverable(DiscoveryAgent.GIAC);
} catch (BluetoothStateException e1) ...{
// TODO Auto-generated catch block
return;
}
StreamConnection conn = null;
try ...{
try ...{
/**//*等待客户端的链接*/
conn = server.acceptAndOpen();
/**//*客户端链接后,关闭发现模式*/
local.setDiscoverable(DiscoveryAgent.NOT_DISCOVERABLE);
} catch (IOException e) ...{
return;
}
/**//*获得输入输出流*/
dis = conn.openDataInputStream();
dos = conn.openDataOutputStream();
/**//*接收数据*/
while(isRunning&&isNoExit) ...{
/**//*等待用户发送数据*/
message = dis.readUTF();
if(isFirstAccept)
...{
/**//*第一接收客户端的数据,客户端的用户名*/
insert(size()-1,new StringItem("","^_^欢迎"
+ message + "进入我的聊天室" + " "));
friendName = message;
isFirstAccept = false;
}
else
...{ /**//*用户退出*/
if(message.equals("exit"))
...{
insert(size()-1,new StringItem("",
friendName + "退出我的聊天室" + " "));
isNoExit = false;
dos=null;
}
else
...{
insert(size()-1,new StringItem("",friendName + "说: "
+ message + " "));
}
}
/**//*线程暂停*/
Thread.sleep(1000);
}
} catch (Exception e) ...{
} finally ...{
if (conn!=null) ...{
try ...{
conn.close();
conn = null;
}catch (Exception e) ...{
}
}
}
}
close();
/**//*结束聊天*/
}
/** *//**
* 关闭连接
*/
public void close() ...{
try ...{
/**//*关闭输入流*/
if (dis != null)
...{
dis.close();
dis = null;
}
/**//*关闭输出流*/
if (dos != null)
...{
dos.close();
dos = null;
}
/**//*关闭服务器*/
if (server != null)
...{
server.close();
server = null;
}
} catch (Exception e) ...{
}
}
/**//*内部类-发送数据的线程*/
class sendThread extends Thread...{
private String data = null;
public sendThread(String data)...{
this.data = data;
}
public void run()...{
if (dos == null) ...{
return;
}
try ...{
dos.writeUTF(data);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}
} // PairChatRoomServer.java文件结束
/** */
/**
* Copyright@scholar_ii
* @author 梧州学院 04计本2班 罗功武
* date 08/02/27
*/
package chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import flat.FlatMainMIDlet;
/** */ /**
* PairChatChatRoomClient 类
* 双人聊天室的客户端类
* 新健一个双人聊天室,并链双人聊天室接服务器
* 采用多线程的技术,客户端主线程,发送数据线程,
* 两种线程维护聊天室的运行
*/
public class PairChatRoomClient extends Form implements
Runnable, CommandListener ... {
/**//*用户娱乐妮称*/
private String userName = null;
/**//*服务器用户的娱妮称*/
private String friendName = null;
/**//*娱乐平台的主类*/
private FlatMainMIDlet flatMainMIDlet = null;
/**//*滚动条*/
static final Ticker ticker = new Ticker("我的聊天室,我做主^_^");
/**//*用于输入要发送的消息*/
private TextField tfData = new TextField("请输入发送的消息",
"",255,TextField.ANY);
private static final Command cmdExit = new Command("退出", Command.EXIT, 0);
private static final Command cmdSend = new Command("发送", Command.SCREEN, 1);
/**//*线程运行标志*/
private boolean isRunning = true;
/**//*链接字符串*/
private String connectURL = null;
/**//*链接流*/
private StreamConnection client = null;
/**//*数据输入流*/
private DataInputStream dis = null;
/**//*数据输出流*/
private DataOutputStream dos = null;
/** *//**
* 构造方法
* 完成客户端聊天室窗口的初使化
* @param connectURL
* @param flatMainMidlet
* @param chatRoomList
* @param userName
* @param friendName
*/
public PairChatRoomClient(String connectURL, FlatMainMIDlet flatMainMidlet,
String userName, String friendName)...{
super("双人聊天室");
this.connectURL = connectURL;
this.flatMainMIDlet = flatMainMidlet;
this.userName = userName;
this.friendName = friendName;
setTicker(ticker);
append(tfData);
addCommand(cmdExit);
addCommand(cmdSend);
setCommandListener(this);
//开始服务器线程
new Thread(this).start();
}
public void commandAction(Command command, Displayable displayable) ...{
if (command == cmdExit) ...{
/**//*发送退出信息*/
new Thread() ...{
public void run() ...{
if (dos == null) ...{
return;
}
String str = "exit";
try ...{
dos.writeUTF(str);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}.start();
isRunning = false;
/**//*线程暂停*/
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
return;
}
close();
flatMainMIDlet.showFlatMenu();
} else if(command == cmdSend) ...{
String str = tfData.getString();
/**//*显示发送的消息*/
insert(size()-1, new StringItem("","我说: " + str + " "));
/**//*发送数据的线程*/
new sendThread(str).start();
tfData.setString("");
}
}
/** *//**
* 客户端聊天线程(接收数据线程)
*/
public void run() ...{
isRunning = true;
try ...{
/**//*链接服务器*/
client = (StreamConnection)Connector.open(connectURL);
/**//*获得输入输出流*/
dis = client.openDataInputStream();
dos = client.openDataOutputStream();
} catch (Exception e) ...{
return;
}
insert(size()-1, new StringItem("","^_^进入" +
friendName + "的聊天室" + " "));
/**//*自动发客服端的用户名给服务器*/
/**//*把自己的用户名发送到服务器*/
String str = userName;
new sendThread(str).start();
/**//*接收数据*/
while(isRunning) ...{
try ...{
String message = dis.readUTF();
if(message.equals("exit"))
...{
insert(size()-1, new StringItem("",friendName +
"离开了聊天室"+ " "));
close();
}
else
...{
insert(size()-1, new StringItem("",friendName +
"说: " + message + " "));
}
Thread.sleep(1000);
} catch (Exception e) ...{
e.printStackTrace();
break;
}
/**//*线程暂停*/
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
}
}
close();
}
/** *//**
* 关闭连接
*/
public void close() ...{
try ...{
/**//*关闭输入流*/
if (dis != null)
...{
dis.close();
dis = null;
}
/**//*关闭输出流*/
if (dos != null)
...{
dos.close();
dos = null;
}
/**//*关闭客户端链接流*/
if (client != null)
...{
client.close();
client = null;
}
} catch (Exception e) ...{
}
}
/**//*内部类-发送数据的线程*/
class sendThread extends Thread...{
private String data = null;
public sendThread(String data)...{
this.data = data;
}
public void run()...{
if (dos == null) ...{
return;
}
try ...{
dos.writeUTF(data);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}
} // PairChatRoomClient.java文件结束
* Copyright@scholar_ii
* @author 梧州学院 04计本2班 罗功武
* date 08/02/27
*/
package chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Ticker;
import flat.FlatMainMIDlet;
/** */ /**
* PairChatChatRoomClient 类
* 双人聊天室的客户端类
* 新健一个双人聊天室,并链双人聊天室接服务器
* 采用多线程的技术,客户端主线程,发送数据线程,
* 两种线程维护聊天室的运行
*/
public class PairChatRoomClient extends Form implements
Runnable, CommandListener ... {
/**//*用户娱乐妮称*/
private String userName = null;
/**//*服务器用户的娱妮称*/
private String friendName = null;
/**//*娱乐平台的主类*/
private FlatMainMIDlet flatMainMIDlet = null;
/**//*滚动条*/
static final Ticker ticker = new Ticker("我的聊天室,我做主^_^");
/**//*用于输入要发送的消息*/
private TextField tfData = new TextField("请输入发送的消息",
"",255,TextField.ANY);
private static final Command cmdExit = new Command("退出", Command.EXIT, 0);
private static final Command cmdSend = new Command("发送", Command.SCREEN, 1);
/**//*线程运行标志*/
private boolean isRunning = true;
/**//*链接字符串*/
private String connectURL = null;
/**//*链接流*/
private StreamConnection client = null;
/**//*数据输入流*/
private DataInputStream dis = null;
/**//*数据输出流*/
private DataOutputStream dos = null;
/** *//**
* 构造方法
* 完成客户端聊天室窗口的初使化
* @param connectURL
* @param flatMainMidlet
* @param chatRoomList
* @param userName
* @param friendName
*/
public PairChatRoomClient(String connectURL, FlatMainMIDlet flatMainMidlet,
String userName, String friendName)...{
super("双人聊天室");
this.connectURL = connectURL;
this.flatMainMIDlet = flatMainMidlet;
this.userName = userName;
this.friendName = friendName;
setTicker(ticker);
append(tfData);
addCommand(cmdExit);
addCommand(cmdSend);
setCommandListener(this);
//开始服务器线程
new Thread(this).start();
}
public void commandAction(Command command, Displayable displayable) ...{
if (command == cmdExit) ...{
/**//*发送退出信息*/
new Thread() ...{
public void run() ...{
if (dos == null) ...{
return;
}
String str = "exit";
try ...{
dos.writeUTF(str);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}.start();
isRunning = false;
/**//*线程暂停*/
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
return;
}
close();
flatMainMIDlet.showFlatMenu();
} else if(command == cmdSend) ...{
String str = tfData.getString();
/**//*显示发送的消息*/
insert(size()-1, new StringItem("","我说: " + str + " "));
/**//*发送数据的线程*/
new sendThread(str).start();
tfData.setString("");
}
}
/** *//**
* 客户端聊天线程(接收数据线程)
*/
public void run() ...{
isRunning = true;
try ...{
/**//*链接服务器*/
client = (StreamConnection)Connector.open(connectURL);
/**//*获得输入输出流*/
dis = client.openDataInputStream();
dos = client.openDataOutputStream();
} catch (Exception e) ...{
return;
}
insert(size()-1, new StringItem("","^_^进入" +
friendName + "的聊天室" + " "));
/**//*自动发客服端的用户名给服务器*/
/**//*把自己的用户名发送到服务器*/
String str = userName;
new sendThread(str).start();
/**//*接收数据*/
while(isRunning) ...{
try ...{
String message = dis.readUTF();
if(message.equals("exit"))
...{
insert(size()-1, new StringItem("",friendName +
"离开了聊天室"+ " "));
close();
}
else
...{
insert(size()-1, new StringItem("",friendName +
"说: " + message + " "));
}
Thread.sleep(1000);
} catch (Exception e) ...{
e.printStackTrace();
break;
}
/**//*线程暂停*/
try ...{
Thread.sleep(1000);
} catch (InterruptedException e) ...{
}
}
close();
}
/** *//**
* 关闭连接
*/
public void close() ...{
try ...{
/**//*关闭输入流*/
if (dis != null)
...{
dis.close();
dis = null;
}
/**//*关闭输出流*/
if (dos != null)
...{
dos.close();
dos = null;
}
/**//*关闭客户端链接流*/
if (client != null)
...{
client.close();
client = null;
}
} catch (Exception e) ...{
}
}
/**//*内部类-发送数据的线程*/
class sendThread extends Thread...{
private String data = null;
public sendThread(String data)...{
this.data = data;
}
public void run()...{
if (dos == null) ...{
return;
}
try ...{
dos.writeUTF(data);
dos.flush();
} catch (IOException e) ...{
return;
}
}
}
} // PairChatRoomClient.java文件结束