理学JAVA聊天室_第1页
理学JAVA聊天室_第2页
理学JAVA聊天室_第3页
理学JAVA聊天室_第4页
理学JAVA聊天室_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于 JAVA的聊天室设计与实现一、设计目的:信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。 “上网冲浪”、 “数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲 击着人们的视听。这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互 技术的发展。人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并 围绕相关的主要现象进行研究的科学。它主要研究人与计算机之间的信息交换, 涉及 计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将 继续对信息技术的发展产生巨大影响。聊天室是一项应用广泛, 并且实用性强的一个非常典型的人

2、机交互系统。在信息 世界里,聊天工具的使用是非常频繁的,如 MSN、 QQ、校内通,之类的聊天工具许多 人都正在使用。此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中, 能够充分学习和使用 JAVA的技术,进一步培养学生面向对象程序设计的思想,加深 对面向对象程序设计四大特性的理解。二、需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。 一个操作简单,界面友好、 运行稳定的聊天室对于小型局域网的用户可以起到很好的 交流作用。所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户 可以通过聊天室将自己融入整个主流社会中。根据目前使用聊天室的用户需求显

3、示,用户对于聊天室主要有以下几点要求:(1)、聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式, 能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。(2)、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友 以及查看对方的开放信息,还能看到对方的登录状态。(3)、文件传输功能:用户可以共享资源,能发送及接收文件。(4)、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是 不可见的。(5)、系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的 情况。该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室 相比该小聊天室功能比较简单

4、,但能实现基本的聊天功能,点对多、点对点聊天和基 本的用户功能,登录、注销、查看在线用户等。三、软件功能描述(1)、用户设置:功能描述:用户自定义自己的登录名, 成功设置后, 服务端能接收到新设置的用户名;(2)、登录功能:功能描述:在服务端开启的情况下, 用户可以以自己自定义或者默认的登录名和登录 地址端口登录到客户端,并能在服务器端显示登录状态;(3)、公聊: 功能描述:用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可 以正常接收并正确显示公聊消息。(4)、私聊: 功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。双方的聊天记 录对于聊天室的其他用户是不可见的。

5、(5)、聊天心情: 功能描述:用户在聊天的过程中可以选择相应的心情来表达自己的情感。(6)、系统消息: 功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送 的信息提示信息。(7)、用户的状态 . 功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。(8)、用户注销: 功能描述:用户可以注销自己的账号,并重新登记登录名和地址。(9)、用户退出: 功能描述:用户可以在正常情况下退出聊天室。(10)、服务端控制: 功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址 端口也必须与服务端的侦听端口一致,否则不能登录。四: 主要模块描述及流程图1

6、、 模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口 Socket(TCP)连接。在 java 中使用套接口相当简单, JavaAPI 为处理套接口的通信提 供了一个类 .Socket., 使得编写网络应用程序相对容易服务器采用多线程 以满足多用户的请求,通过 JDBC与后台数据库连接,并通过创建一个 ServerSocket 对象来监听来自客户的连接请求,默认 IP 地址为: 127.0.0.1 默认端口为 8888。1)聊天室服务端模块图:聊天室服务端端口服务:启动服务:开始聊天;停止服务:发送系统消息:服务器端给所有人或者个别用户发送消息消息显示:可以显示所有

7、用户的聊天记录,和上线、下线信息退出服务器:退出程序,并停止服务;(2)聊天室客户端模块图:用户设置: 连接设置: 127.0.0.1: 用户登录:开始聊天,登录后不能再修改用户设置和连接设置; 用户注销:退出聊天,可以继续修改用户设置和连接设置;发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户 发送给自己或所有人的消息;退出:关闭所有聊天并退出客户端 。默认端口: 8888设置用户聊名天登录默认连接地址或用户名 设置 IP 地址和端口退出用户设置 聊天室客户端连接设置五. 主要类 UML关系图:聊天室服务器端设计:ThreadJFrameActionListener

8、1、聊天室服务器端设计:ChatServer7ServerListen- server: ServerSocket- userLinkList :UserLinkLis- isStop: public Boolean ServerSocket,JComboBox,JTextAre sr:SeroLciknektL ist)uhsaetrSLienrkvLeisrt :U的serpLuinbkLliicst 类,其主要功能为定文件,它们-port:public static in -serverS(oc1k)et:CSehravetSrSeorcvkeert. java :包 -义umse服es

9、rsL务aingk器eLSis端hto:U的ws:Je界TrLe面ixntkA,Lries添ta 加事件侦听-userLinkList:UserLinkList-用sh户ow上Sta线tu与s:J下Te线xtF的iel侦d 听,调用 ServerRe + ChatS(e+init():p(ublic void+上st线artS下e线rvic的e(侦):p听ubl是ic v通oi过d 调用用户链表类( +线st情opS况er发vic生e()变:pu化bl时ic v,oid该 类会对主类 +sendStopToAll():public void +send(Ms3gT)oASlel(Srvtrei

10、nrgR):epcuebliivce v.ojaidv a: +义 s了end向Sy某st用em户Me及ss所ag有e()人:pu发bli送c v消oid息 的方法,发送a,J的Te消xtF息ie会ld,U显se示rL在ink主Lis界t) 面类的界面上包含名为与事件处C- u- isStop: public Boolean理。调用 ServerListen 类来实现服务端 +ServerListen(ServerSocket,JComboBox,JTextAre ceai,vJeTex类tFi来eld实,U现ser服Lin务kL器ist端) 的消息的收发。er2ve)r()S:peurbvl

11、eicr Listen.java:blic void该类实现服Se务rv端erR用ec户eiv上e 线与下线的侦听。该类对用户-UtesxetarrLeian:kJTLeisxtAre)a 来实现的,当用户上线与下 类的界面进行- u相se应rLin的kL修ist改 :U。serLinkList- isStop: public Boolean 该类是实现+S服er务ver器Lis端ten的(S消er息ver的So收ck发et,J的Co类m。boBox该,JT类ex分tA别re定4)PortConf.java: 该类继承自 JDialog ,是用户对服务器端侦听端口进行修改配置的类。5)Node

12、.java: 用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点 Node类的功能相当( 6)UserLinkList.java: 用户链表节点的具体实现类。该类通过构造函数构造 用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这 5 个方法。(7)Help.java: 服务端程序的帮助类4)UserConf.java: 该类继承自 JDialog ,是用户对连接到服务器所显示的用户名进行修改配置的类。( 5) Help.java: 客户端程序的帮助类六. 主要程序代码清单和注释说明:*ChatServer.javapublic void act

13、ionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = startServer | obj = startItem) /启动服务端startService();else if (obj = stopServer | obj = stopItem) /停止服务端int j=JOptionPane.showConfirmDialog( this, 真的停止服务吗 ?, 停止服务 , JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane

14、.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口设置/ 调出端口设置的对话框PortConf portConf = new PortConf(this);portConf.show();else if (obj = exitButton | obj = exitItem) /退出程序int j=JOptionPane.showConfirmDialog(this, 真的要退出吗 ?, 退出 , JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if

15、 (j = JOptionPane.YES_OPTION)stopService();System.exit(0);else if (obj = helpItem) / 菜单栏中的帮助/ 调出帮助对话框Help helpDialog = new Help(this);helpDialog.show();else if (obj = sysMessage | obj = sysMessageButton) /发送系统消息sendSystemMessage();/* 启动服务端*/public void startService()tryserverSocket = new ServerSocke

16、t(port,10); messageShow.append( 服务端已经启动,在 +port+ 端口侦听 .n); startServer.setEnabled(false);startItem.setEnabled(false);portSet.setEnabled(false);portItem.setEnabled(false);stopServer .setEnabled(true);stopItem .setEnabled(true);sysMessage.setEnabled(true);catch (Exception e)/System.out.println(e);user

17、LinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();/* 关闭服务端*/public void stopService()try/ 向所有人发送服务器关闭的消息sendStopToAll();listenThread.isStop = true; serverSocket.close();int count = userLinkList.getCount();int

18、 i =0;while( i count)Node node = userLinkList.findUser(i); node.input .close(); node.output.close(); node.socket.close();i +;stopServer .setEnabled(false); stopItem .setEnabled(false); startServer.setEnabled(true); startItem.setEnabled(true); portSet.setEnabled(true); portItem.setEnabled(true); sysM

19、essage.setEnabled(false); messageShow.append( 服务端已经关闭 n); combobox.removeAllItems(); combobox.addItem( 所有人 );catch(Exception e)/System.out.println(e);/* 向所有人发送服务器关闭的消息*/public void sendStopToAll()int count = userLinkList.getCount();int i = 0;while(i count)Node node = userLinkList.findUser(i); if(nod

20、e = null) i +;continue;trynode.output.writeObject( 服务关闭 ); node.output.flush();catch (Exception e) /System.out.println($+e);i+;/* 向所有人发送消息*/public void sendMsgToAll(String msg)int count = userLinkList.getCount();/ 用户总数int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;c

21、ontinue;trynode.output.writeObject( 系统信息 );node.output.flush();node.output.writeObject(msg);node.output.flush();catch (Exception e)/System.out.println(+e);i+;sysMessage.setText();/* 向客户端用户发送消息*/public void sendSystemMessage()String toSomebody = combobox.getSelectedItem().toString();String message =

22、sysMessage.getText() + n; messageShow.append(message);/ 向所有人发送消息if(toSomebody.equalsIgnoreCase( 所有人 )sendMsgToAll(message);else/ 向某个用户发送消息Node node = userLinkList.findUser(toSomebody); trynode.output.writeObject( 系统信息 ); node.output.flush();node.output.writeObject(message); node.output.flush(); catc

23、h(Exception e)/System.out.println(!+e); sysMessage.setText();/ 将发送消息栏的消息清空public static void main(String args) ChatServer app = new ChatServer();ServerListen.java:public class ServerListen extends Thread ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;用户链表UserLinkList

24、userLinkList;/ Node client;ServerReceive recvThread; public boolean isStop;/* * 聊天服务端的用户上线于下线侦听类*/public ServerListen(ServerSocket server,JComboBox combobox, JTextArea textarea,JTextField textfield,UserLinkList userLinkList) this.server = server;bobox = combobox;this.textarea = textarea;this.textfie

25、ld = textfield; this.userLinkList = userLinkList; isStop = false;public void run()while(!isStop & !server.isClosed()tryclient = new Node();client.socket = server.accept();newnew人n);client.output =ObjectOutputStream(client.socket.getOutputStream();client.output.flush();client.inputObjectInputStream(c

26、lient.socket.getInputStream();client.username = (String)client.input.readObject();/ 显示提示信息combobox.addItem(client.username);userLinkList.addUser(client);textarea.append( 用户 + client.username + 上线 + n)textfield.setText( 在线用户 + userLinkList.getCount() + recvThread = new ServerReceive(textarea,textfiel

27、d, combobox,client,userLinkList);recvThread.start();catch(Exception e)*ServerReceive.java/* 服务器收发消息的类*/public class ServerReceive extends Thread JTextArea textarea;JTextField textfield;JComboBox combobox;Node client;UserLinkList userLinkList;/ 用户链表 public boolean isStop;public ServerReceive(JTextAre

28、a textarea,JTextField textfield, JComboBox combobox,Node client,UserLinkList userLinkList) this.textarea = textarea; this.textfield = textfield;this.client = client;this.userLinkList = userLinkList; bobox = combobox; isStop = false;public void run()/ 向所有人发送用户的列表 sendUserList();while(!isStop & !clien

29、t.socket.isClosed()tryString type = (String)client.input.readObject(); if(type.equalsIgnoreCase( 聊天信息 )String toSomebody = (String)client.input.readObject();String status = (String)client.input.readObject();String action = (String)client.input.readObject();String message = (String)client.input.readO

30、bject();String msg = client.username+ + action+ 对 + toSomebody+ 说 : + message+ n;if(status.equalsIgnoreCase( 悄悄话 )msg = 悄悄话 + msg;textarea.append(msg);if(toSomebody.equalsIgnoreCase( 所有人 ) sendToAll(msg);/ 向所有人发送消息elsetryclient.output.writeObject( 聊天信息 );client.output.flush();client.output.writeObje

31、ct(msg);client.output.flush();catch (Exception e)/System.out.println(#+e);Node node = userLinkList.findUser(toSomebody);if(node != null)node.output.writeObject( 聊天信息 );node.output.flush();node.output.writeObject(msg);node.output.flush();else if(type.equalsIgnoreCase( 用户下线 )Node node = userLinkList.f

32、indUser(client.username);userLinkList.delUser(node);String msg = 用户 + client.username + 下线 n;int count = userLinkList.getCount();combobox.removeAllItems(); combobox.addItem( 所有人 ); int i = 0;while(i count)node = userLinkList.findUser(i); if(node = null) i +;continue;combobox.addItem(node.username);

33、i+;combobox.setSelectedIndex(0);textarea.append(msg);textfield.setText( 在线用户 + userLinkList.getCount() + n);sendToAll(msg);/ sendUserList();/ break;向所有人发送消息 重新发送用户列表 , 刷新catch (Exception e)/System.out.println(e);/* 向所有人发送消息 */public void sendToAll(String msg) int count = userLinkList.getCount(); int

34、 i = 0;while(i count)Node node = userLinkList.findUser(i); if(node = null) i +;continue;trynode.output.writeObject( 聊天信息 );node.output.flush();node.output.writeObject(msg);node.output.flush();catch (Exception e)/System.out.println(e);i+;/* 向所有人发送用户的列表*/public void sendUserList()String userlist = ;in

35、t count = userLinkList.getCount();int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +; continue;userlist += node.username;userlist += n;i+;i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +; continue;trynode.output.writeObject( 用户列表 ); node.outp

36、ut.flush();node.output.writeObject(userlist); node.output.flush();catch (Exception e) /System.out.println(e);i+;PortConf.java/* * 生成端口设置对话框的类*/ public class PortConf extends JDialog JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGIN

37、FO=new JLabel( 默认端口号为 :8888);JPanel panelSave = new JPanel();JLabel message = new JLabel();public static JTextField portNumber ;public PortConf(JFrame frame) super(frame, true);try jbInit();catch (Exception e) e.printStackTrace();/ 设置运行位置,使对话框居中Dimension screenSize = Toolkit.getDefaultToolkit().getS

38、creenSize(); this.setLocation( (int) (screenSize.width - 400) / 2 + 50,(int) (screenSize.height - 600) / 2 + 150); this.setResizable(false);private void jbInit() throws Exception this.setSize(new Dimension(300, 120);this.setTitle( 端口设置 );message.setText( 请输入侦听的端口号 :);portNumber = new JTextField(10);

39、 portNumber.setText(+ChatServer.port);save.setText( 保存 );cancel.setText( 取消 );panelPort.setLayout(new FlowLayout();panelPort.add(message);panelPort.add(portNumber);panelSave.add(new Label();panelSave.add(save);panelSave.add(cancel);panelSave.add(new Label();Container contentPane = getContentPane();c

40、ontentPane.setLayout(new BorderLayout(); contentPane.add(panelPort, BorderLayout.NORTH); contentPane.add(DLGINFO, BorderLayout.CENTER); contentPane.add(panelSave, BorderLayout.SOUTH);/ 保存按钮的事件处理save.addActionListener(new ActionListener() public void actionPerformed (ActionEvent a) int savePort;trysa

41、vePort=Integer.parseInt(PortConf.portNumber.getText();if(savePort65535)侦听端口必PortConf.DLGINFO.setText( 须是 0-65535 之间的整数 !);PortConf.portNumber.setText();return;ChatServer.port = savePort; dispose();错误的端口号 catch(NumberFormatException e) PortConf.DLGINFO.setText( 端口号请填写整数 !);PortConf.portNumber.setText

42、();return;);/ 关闭对话框时的操作this.addWindowListener(new WindowAdapter()默认端口号public void windowClosing(WindowEvent e)DLGINFO.setText(为:8888););/ 取消按钮的事件处理cancel.addActionListener(new ActionListener()默认端口号public void actionPerformed(ActionEvent e)DLGINFO.setText(为:8888);dispose(););*Node.java*用户链表的结点类*/publ

43、ic class Node String username = null;Socket socket = null;ObjectOutputStream output = null; ObjectInputStream input = null;Node next = null;UserLinkList.java* 用户链表*/public class UserLinkList Node root;Node pointer; int count;/ 删除用户 */public void delUser(Node n) pointer = root; while(pointer.next !=

44、null) if(pointer.next = n) pointer.next = n.next;* 构造用户链表*/public UserLinkList() root = new Node(); root.next = null; pointer = null; count = 0;* 添加用户*/public void addUser(Node n) pointer = root; while(pointer.next != null) pointer = pointer.next; pointer.next = n;n.next = null; count+;count -; brea

45、k;pointer = pointer.next;* 返回用户数*/public int getCount() return count;/ 根据索引查找用户 */ public Node findUser(int index) if(count = 0) return null;if(index 0) return null;pointer = root;int i = 0;while(i index + 1) if(pointer.next != null) pointer = pointer.next;elsereturn null;i+;* 根据用户名查找用户 */ public No

46、de findUser(String username)if(count = 0) return null;pointer = root;while(pointer.next != null)pointer = pointer.next;if(pointer.username.equalsIgnoreCase(username) return pointer;return null;return pointer;*Help.java* 生成设置对话框的类 */public class Help extends JDialog JPanel titlePanel = new JPanel();

47、JPanel contentPanel = new JPanel(); JPanel closePanel = new JPanel(); JButton close = new JButton();JLabel title = new JLabel(聊天室服务端帮助 );JTextArea help = new JTextArea();Color bg = new Color(255,255,255); public Help(JFrame frame) super(frame, true); try jbInit();catch (Exception e) e.printStackTrac

48、e();/ 设置运行位置,使对话框居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - 400) / 2,(int) (screenSize.height - 320) / 2);this.setResizable(false);private void jbInit() throws Exception this.setSize(new Dimension(400, 200);this.setTitle( 帮助 );ti

49、tlePanel.setBackground(bg); contentPanel.setBackground(bg);closePanel.setBackground(bg);help.setText(1 、设置服务端的侦听端口(默认端口为8888)。 n+2 、点击 启动服务 按钮便可在指定的端口启动服务。 n+n+3 、选择需要接受消息的用户, 在消息栏中写入消息, 之后便可发送消息。4 、信息状态栏中显示服务器当前的启动与停止状态、 + 用户发送的消息和 n help.setEditable(false);服务器端发送的系统消息。 );titlePanel.add(new Label()

50、;titlePanel.add(title);titlePanel.add(new Label(); contentPanel.add(help);closePanel.add(new Label();closePanel.add(close);closePanel.add(new Label();Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout(); contentPane.add(titlePanel, BorderLayout.NORTH); contentPane.add(c

51、ontentPanel, BorderLayout.CENTER); contentPane.add(closePanel, BorderLayout.SOUTH); close.setText( 关闭 );/ 事件处理close.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) dispose(););聊天室客户端设计 :ChatClient.java/* 聊天客户端的主框架类*/public class ChatClient extends JFrame implements

52、ActionListener /* */private static final long serialVersionUID = 1L;String ip = 127.0.0.1;/连接到服务端的 ip 地址int port = 8888;/ 连接到服务端的端口号String userName = 狂狂 ;/ 用户名int type = 0;/0表示未连接, 1 表示已连接JComboBox combobox;/ 选择发送消息的接受者 JTextArea messageShow;/ 客户端的信息显示 JScrollPane messageScrollPane;/ 信息显示的滚动条 JLabel express,sendToLabel,messageLabel ;JTextField clientMessage;/ 客户端消息的发送 JCheckBox checkbox;/ 悄悄话JComboBox actionlist;/ 表情选择JButton clientMessageButton;/ 发送消息JTextField showStatus;/ 显示用户连接状态Socket socket;Ob

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论