/** *//** * Copyright@scholar_ii * @author 梧州学院 04计本2班 罗功武 * date: 08/02/29 */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;/** *//*** MultiChatChatRoomClient 类* 多人聊天室的客户端类* 新健一个多人聊天室,并链多人聊天室接服务器* 采用多线程的技术,客户端主线程,发送数据线程,* 两种线程维护聊天室的运行*/public class MultiChatRoomClient 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 MultiChatRoomClient(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) ...{ } } }.start(); isRunning = false; /**//*线程暂停*/ try ...{ Thread.sleep(1000); } catch (InterruptedException e) ...{ return; } close(); flatMainMIDlet.showFlatMenu(); } else if(command == cmdSend) ...{ /**//*发送数据的线程*/ new Thread() ...{ public void run() ...{ if (dos == null) ...{ return; } String str = tfData.getString(); try ...{ dos.writeUTF(str); dos.flush(); } catch (IOException e) ...{ return; } } }.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 + "的聊天室" + " ")); /**//*把自己的用户名发送到服务器*/ new Thread() ...{ public void run() ...{ if (dos == null) ...{ return; } String str = userName; try ...{ dos.writeUTF(str); dos.flush(); } catch (IOException e) ...{ close(); return; } } }.start(); /**//*接收数据*/ while(isRunning) ...{ try ...{ String message = dis.readUTF(); if(message.equals("exit")) ...{ insert(size()-1, new StringItem("",friendName + "关闭了聊天室"+ " ")); dos = null; } else ...{ insert(size()-1, new StringItem("", message + " ")); } Thread.sleep(1000); } catch (Exception e) ...{ close(); return; } /**//*线程暂停*/ 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) ...{ } }}//MultiChatRoomClient.java类文件结束 /** *//** * Copyright@scholar_ii * @author 梧州学院 04计本2班 罗功武 * date 08/02/28 */package chat;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.Vector;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 MultiChatRoomServer extends Form implements Runnable, CommandListener ...{ /**//*用户召娱乐妮称*/ private String userName; /**//*娱乐平台主类*/ 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 StreamConnectionNotifier server = null; /**//*数据输出流列表*/ private Vector dosList = null; /**//*MultiChatServerThread列表*/ private Vector serverThreadList = null; /** *//** * 构造方法 * 完成多人聊天窗口的初使化 * @param midlet * @param mainMenu * @param name */ public MultiChatRoomServer(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 run() ...{ isRunning = true; dosList = new Vector(); serverThreadList = new Vector(); LocalDevice local = null; try ...{ /**//*设置设备的发现模式,使设备处可发现*/ local = LocalDevice.getLocalDevice(); local.setDiscoverable(DiscoveryAgent.GIAC); } catch (BluetoothStateException e) ...{ return; } try ...{ /**//*开启服务*/ server = (StreamConnectionNotifier)Connector.open( "btspp://localhost:22222222222222222222222222222222"); /**//*服务器服务记录*/ 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; } while(isRunning) ...{ StreamConnection conn = null; try ...{ /**//*等待客户端的链接*/ conn = server.acceptAndOpen(); } catch (IOException e) ...{ return; } /**//*聊天服务线程*/ MultiChatServerThread serverThread = new MultiChatServerThread(conn); serverThreadList.addElement(serverThread); new Thread(serverThread).start(); try ...{ Thread.sleep(2000); } catch (InterruptedException e) ...{ } } } public void commandAction(Command command, Displayable displayable) ...{ if (command == cmdExit) ...{ /**//*发送退出信息*/ new Thread() ...{ public void run() ...{ if (serverThreadList.size() < 1) ...{ return; } String str = "exit"; try ...{ for(int i=0; i<serverThreadList.size() ;i++) ...{ ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.writeUTF(str); ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.flush(); } } catch (IOException e) ...{ } } }.start(); isRunning = false; try ...{ Thread.sleep(1000); } catch (InterruptedException e) ...{ } for(int i=0; i<serverThreadList.size() ;i++) ...{ ((MultiChatServerThread)serverThreadList. elementAt(i)).close(); ((MultiChatServerThread)serverThreadList. elementAt(i)).close(); } flatMainMIDlet.showFlatMenu(); } else if(command == cmdSend) ...{ //发送数据,新建发送数据线程 new Thread() ...{ public void run() ...{ if (serverThreadList.size() < 1) ...{ return; } String str = tfData.getString(); try ...{ for(int i=0; i<serverThreadList.size() ;i++) ...{ ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.writeUTF(userName + " 说: "+ str); ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.flush(); } } catch (IOException e) ...{ } //显示发送的消息 insert(size()-1,new StringItem("","我说: " + str + " ")); tfData.setString(""); } }.start(); } } class MultiChatServerThread implements Runnable...{ /**//*是否是第一次接收数据*/ private boolean isFirstAccept = true; /**//*客户端是否退出*/ private boolean isNoExit = true; private StreamConnection conn= null; public DataOutputStream dos = null; public DataInputStream dis = null; /**//*客服端用户娱乐的妮称*/ public String friendName = null; public MultiChatServerThread(StreamConnection conn)...{ this.conn = conn; } public void run() ...{ try ...{ dis = conn.openDataInputStream(); dos = conn.openDataOutputStream(); } catch (IOException e) ...{ close(); return; } dosList.addElement(dos); String message = null; /**//*接收数据*/ while(isRunning&&isNoExit) ...{ /**//*等待用户发送数据*/ try ...{ message = dis.readUTF(); } catch (IOException e1) ...{ close(); return; } 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; close(); } else ...{ String str = new String(friendName + "说: " + message); insert(size()-1,new StringItem("",str)); /**//*转发数据到其它客户端*/ try...{ for(int i= 0; i<serverThreadList.size(); i++) ...{ ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.writeUTF(str); ((MultiChatServerThread)serverThreadList. elementAt(i)).dos.flush(); } }catch(IOException e) ...{ close(); return; } } } /**//*线程暂停*/ try ...{ Thread.sleep(1000); } catch (InterruptedException e) ...{ e.printStackTrace(); } } } private void close() ...{ try ...{ /**//*关闭输入流*/ if (dis != null) ...{ dis.close(); dis = null; } /**//*关闭输出流*/ if (dos != null) ...{ dos.close(); dos = null; } /**//*关闭服务器*/ if (conn != null) ...{ conn.close(); conn = null; } } catch (Exception e) ...{ } } }}//MultiChatRoomServer.java文件结束