1、局域网聊天室Java课程设计 面向对象程序设计课程设计报告题 目:局域网聊天室程序设计院 系: 信息科学与工程学院 专业班级: 计算机科学与技术1201班 学生某某:程伟 学 号: 20121183011指导教师: 吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计 课程设计任务书一、设计调查报告/论文题目 局域网聊天室程序设计二、设计调查报告/论文主要内容内容:用来提供局域网中用户之间的交互通讯,使用Eclipse与JDK1.6工具,操作系统为WINDOWS,采用面向对象方法完成,包括总体设计、详细设计、编码实现、测试。运用套接字S
2、ocket连接技术,实现客户端的套接字对象和服务器端的套接字对象之间的输入输出流的连接,达到数据报通信的目的 根本功能与要求:实现聊天室服务器端的要求:设计实现在特定端口上进展侦听,等待客户端的连接。用户确定服务器的侦听端口。系统能向已经连接到服务器端的用户发送系统消息。系统能统计在线人数。当系统停止服务时,设计程序应能断开所有的用户连接。实现聊天室客户端的要求:系统能连接已经开启聊天服务的服务端。用户确定要连接服务器端的IP地址与端口号,连接后系统应能提供显示的用户名。当服务器端开启的话,实现用户的登录与注销。用户可以通过设计的系统向所有人或者某一个人发送消息。三、原始资料1.面向对象程序设
3、计课程设计指导书2.耿祥义JAVA大学实用教程:清华大学,2009四、要求的设计调查/论文成果五、进程安排布置任务,查找资料、需求分析1天总体设计1天详细设计编制源程序实现测试与修改1天撰写课设报告2天六、主要参考资料1 X广彬. Java课程设计案例精编第二版.:清华大学, 2011.2 耿祥义. Java课程设计第二版.:清华大学, 2008.3 耿祥义JAVA大学实用教程:清华大学,20094 邹林达陈国君 Java2程序设计根底:清华大学,20105 邹林达Java2程序设计根底实验指导:清华大学,2010指导教师签名: 20 年 月 日1需求与总体设计本系统所要实现的主要功能是为广阔
4、用户提供一个借助网络进展人际交往的平台。因为服务端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用TCP协议进展网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。1.2.1 服务端系统2详细设计聊天室服务器端的设计2.1.1 ChatServer类包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。2.1.2 ServerListen类 该类实现服务器用户上线与下线的监听。该类对用户上线下线的监听是
5、通过调用用户链表类UserLinkList来实现的。当用户上线与下线情况发生变化时,该类会对主类的界面进展相应的修改。2.1.3 ServerReceive类该类是实现服务器消息收发的类,该类分别定义了向某用户与所有人发送消息的方法,发送的消息会显示在主界面类的街面上。2.1.4 PortConf类 该类继承自Jdialog,是用户对服务器端监听端口进展修改配置的类。2.1.5 Help类服务端程序帮助类。2.1.6 UserLinkList类用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。2.1.7
6、 Node类用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当2.2.1 ChatClient类包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理。该类定义了Connect与DisConnect方法实现与客户端的连接与断开连接。当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga方法来其他用户发送带有表情的消息或悄悄话。2.2.2 ConnectConf类该类继承自Jdialog,是用户对所有要连接的服务器IP与监听端口进展修改配置的类。2.2.3 UserC
7、onf类该类继承自Jdialog,是用户对到服务器时所显示的用户名进展修改配置的类。2.2.4 Help类客户端程序的帮助类。2.2.5 ClientReceive类该类是实现服务器端与客户端消息收发的类。3编码实现3.1.1 ChatServer类包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加时间监听与时间处理。调用ServerListen类来实现服务端用户上线与下线的监听,调用ServerListen来实现服务器端的消息收发。/ * 聊天服务端的主框架类*/public class ChatServer extends JFrame implements
8、 ActionListenerprivate static final long serialVersionUID = 1L;public static int port = 8888;/服务端的侦听端口ServerSocket serverSocket;/服务端SocketoBox bobox;/选择发送消息的承受者JTextArea messageShow;/服务端的信息显示JScrollPane messageScrollPane;/信息显示的滚动条JTextField showStatus;/显示用户连接状态JLabel sendToLabel,messageLabel;JTextFi
9、eld sysMessage;/服务端消息的发送utton sysMessageButton;/服务端消息的发送按钮UserLinkList userLinkList;/用户链表/建立菜单栏JMenuBar jMenuBar = new JMenuBar(); /建立菜单组JMenu serviceMenu = new JMenu (服务(V); /建立菜单项JMenuItem portItem = new JMenuItem (端口设置(P);JMenuItem startItem = new JMenuItem (启动服务(S);JMenuItem stopItem=new JMenuIt
10、em (停止服务(T);JMenuItem exitItem=new JMenuItem (退出(X);JMenu helpMenu=new JMenu (帮助(H);JMenuItem helpItem=new JMenuItem (帮助(H);/建立工具栏JToolBar toolBar = new JToolBar();/建立工具栏中的按钮组件utton portSet;/启动服务端侦听utton startServer;/启动服务端侦听utton stopServer;/关闭服务端侦听utton exitButton;/退出按钮/框架的大小Dimension faceSize = ne
11、w Dimension(400, 600);ServerListen listenThread;JPanel downPanel ;GridBagLayout girdBag;GridBagConstraints girdBagCon;/* 服务端构造函数*/public ChatServer()init();/初始化程序/添加框架的关闭事件处理this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.pack();/设置框架的大小this.setSize(faceSize);/设置运行时窗口的位置Dimension screenSize
12、 = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - faceSize.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2);this.setResizable(false);this.setTitle(聊天室服务端); /设置标题setVisible(true);/为服务菜单栏设置热键VserviceMenu.setMnemonic(V);/为端口设置快捷键为ctrl+pportIt
13、em.setMnemonic (P); (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK);/为启动服务快捷键为ctrl+sstartItem.setMnemonic (S); startItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK);/为端口设置快捷键为ctrl+TstopItem.setMnemonic (T); stopItem.setAccelerator(KeyStroke.getKeyStroke (K
14、eyEvent.VK_T,InputEvent.CTRL_MASK);/为退出设置快捷键为ctrl+xexitItem.setMnemonic (X); exitItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK);/为帮助菜单栏设置热键HhelpMenu.setMnemonic(H);/为帮助设置快捷键为ctrl+phelpItem.setMnemonic (H); helpItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_H
15、,InputEvent.CTRL_MASK);/* 程序初始化函数*/public void init()Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout();/添加菜单栏serviceMenu.add (portItem);serviceMenu.add (startItem);serviceMenu.add (stopItem);serviceMenu.add (exitItem);jMenuBar.add (serviceMenu); helpMenu.add (helpItem
16、);jMenuBar.add (helpMenu); setJMenuBar (jMenuBar);/初始化按钮portSet = new utton(端口设置);startServer = new utton(启动服务);stopServer = new utton(停止服务 );exitButton = new utton(退出 );/将按钮添加到工具栏toolBar.add(portSet);toolBar.addSeparator();/添加分隔栏toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator(
17、);/添加分隔栏toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);/初始时,令停止服务按钮不可用stopServer.setEnabled(false);stopItem .setEnabled(false);/为菜单栏添加事件监听portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem
18、.addActionListener(this);/添加按钮的事件侦听portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionListener(this);exitButton.addActionListener(this);bobox = new oBox();bobox.insertItemAt(所有人,0);bobox.setSelectedIndex(0);messageShow = new JTextArea();messageShow.setEditable(fa
19、lse);/添加滚动条messageScrollPane = new JScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400);messageScrollPane.revalidate();showStatus = new JTextField(35);showStatus.setEditable(false);sysMe
20、ssage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new utton();sysMessageButton.setText(发送);/添加系统消息的事件侦听sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(发送至:);messageLabel = new JLabel(发送消息:);downPanel = new JPanel();girdBag
21、 = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel( );girdBag.setConstraints(none,girdBagCon);downPan
22、el.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets = new Insets(1,0,0,0);girdBagCon.ipadx = 5;girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gr
23、idx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(bobox,girdBagCon);downPanel.add(bobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);gird
24、BagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMes
25、sageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.gridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);/关闭程序时的操作t
26、his.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)stopService();System.exit(0););/* 事件处理*/public void actionPerformed(ActionEvent e) Object obj = e.getSource();if (obj = startServer | obj = startItem) /启动服务端startService();else if (obj = stopServer | obj = stopItem) /停止
27、服务端int j=JOptionPane.showConfirmDialog(this,真的停止服务吗?,停止服务,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口设置/调出端口设置的对话框PortConf portConf = new PortConf(this);portConf.setVisible(true);else if (obj = exitBut
28、ton | obj = exitItem) /退出程序int j=JOptionPane.showConfirmDialog(this,真的要退出吗?,退出,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0);else if (obj = helpItem) /菜单栏中的帮助/调出帮助对话框Help helpDialog = new Help(this);helpDialog.setVisible(true);else i
29、f (obj = sysMessage | obj = sysMessageButton) /发送系统消息sendSystemMessage();/* 启动服务端*/public void startService()tryserverSocket = new ServerSocket(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);userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,bobox,messageShow,showStatus,userLinkList);listenThread.start();/* 关闭服务端*/p