(1)Client类:实现客户端的功能。 (2)Clienfframe类:设计客厂T端的用户界面。 (3)ClientUtil类:用于处理字符串和显示信息和表情图片 的工具类。 (4)Server类:服务器端主类,用于实现服务器端功能。 (5)Message类:实现了聊天信息的属性和方法。 (6)Usermessage类:实现了用户信息的属性和方法。 3.22系统娄关系视图 系统类关系视图如图2所示 ![]() 3,2.3系统实现关键 (1)控制好Socket个数和分配是决定程序能甭完成的关键。 (2)实现群聊是整个程序关键.利用群聊可以实现单醉和 文件传送。 (3)理清服务器端和客户端交互过程和传递的数据。 如何理解整个客户端和服务器端通信的这个模型。主要是 对ServerSocket中的accept方法接收到的Socket的理解。通信 过程是:首先服务器端肩动,建立监听端151,等待连接。其次 是客户端(c1、c2和c3)与服务器发起连接.由ServerSocket 中的accept方法建立一个Socket(SI、S2和S3),客户端和服 务器双方就分别通过各自相对应的&"ket进行通信,而 Serversocket建立的监听端口则继续进行监听,它本身并不参 与具体的通信过程。 4主要功能模块设计和实现 4.1用户列表模块 4.1.1用户列衰界面 当用户输人用户名后就会进人到用户列表窗口.界面设计 如图3所示。 ![]() 1.2用户列表功能实现 用户列表窗f1要完成的功能是:显示所有在线用户信息, 监听群聊事件和监听私聊事件,并触发聊天窗ra的显示。 显示所有在线用户信息的代码如下: if(u.flag1){ dim.clear(); for(Int i=0:i<o.1ength:i++){ dim.addElement(o[i]toStringO); } }else{ for(int i=0:i<dim size();i++){ String s=dim.get(i)toStringO; String[] ss=s split("\\s+"): if(ss[Ol equals(u usemame)){ dim.remove(i); break; } } } 4.2用户通信模块 4.2.1聊天界面 当用户点击群聊按钮或双击用户列表中某个在线用户后就 会弹出到聊天窗13,界面设计如图4所示。 ![]() 4.2.2聊天功能实现 私聊和群聊使用同一处理模块,该模块处理已接收信息, 将表情与字符分开.主要代码如下: Pattern P=Pattern.compile('.gff'): Matcher m=p.matcher(msg); while(m.find())( int start=m.start(1—2: Iist.add(start): start=start+6: if{start>msg.lengthOJ{ break; } list add(start); ) for(int i=0:I<Iist size();i++) if(i<Jist size()一1){ int begin=Integer parseInt(1ist get(i)toStringO); let over=Integer.parseInt(1ist get(i+1l toStringO); String subs=msg substring(begin,over); substrlist.add(subs); )else{ String subs=msgsubstring(IntegeLparseln(istget()).toStringO)); substrlist add(subs); ) ) 将处理过的信息显示在面板上: for (int i=O:j<msglist size();i++){ Matcher m=Dmatcher(sub); 州m.find()){ URL url=this getClass().getClassLoader().getResource{’ Image/"+sub); textPane setCaretPosition(doc getLength()): image=new Imagelcon(url); textPane.insertlcon(image); )else( doc insertString(doc getLenOthO,sub.attd; } ) } 4.3服务器转发模块 服务器端不需要出现图形用户界面.服务器端所要做的工 作就是接收各个客户端传来的信息,识别信息的类型f包括用 户信息、上线信息、私聊信息、群聊信息和文件信勘.再将 信息转发给相应的客户。 将监听方法做成一个线程,此线程只负责监听.用于产生 一个新的Soekel.并将其存储起来,关键代码如下: class ServerThread extends Thread( pubric void run(J( while(true){ Socket sc=ss accept(); ObjectOutputStream OOS=new ObjectOutputStream(sc getOutputStreamO); mp put(sc,cos); SocketThread st=new SocketThread(sc); st start(); } } ) 转发聊天信息: Message u=(Message)m: if(u.toname equals(’alluser')}{ |