1、java课程设计报告聊天室JAVA程序设计课程设计报告班级: (4号楷体)学号: (4号楷体)姓名: (4号楷体)指导教师: (4号楷体)完成日期: 2009 年 9 月(4号楷体)一: 题目内容的描述本文围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对计算器程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。在编程我们使用的java语言,是目前比较流行的编程语言。在当今这个网络的时代,java语言在网络编程方面的优势使得网络编程有了更好的选择。Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。二: 需求分析1.1 开发
2、背景:在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个局域网的网络聊天工具的;而且通过制作该程序还能更好的学习网络软件编程知识.1.1 功能要求:(1)登录功能.(2)客户可以通过服务器转发,实现一对一和多对多聊天.(3)实现呼叫功能.(4)客户端程序应该可以实时显示目前其它用户的状态.三: 主要模块的算法描述 聊天室服务器端设计: 聊天室客户端设计:四: 详细设计 聊天室服务器端设计:聊天室服务端主要包括7个文件,它们的功能如下:(1)ChatServer.java:包含名为ChatS
3、erver的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*;/* * 聊天服务端的主框架类 */public class ChatServer extends JFrame implements ActionListe
4、ner public static int port = 8888;/服务端的侦听端口 ServerSocket serverSocket;/服务端Socket Image icon;/程序图标 JComboBox combobox;/选择发送消息的接受者 JTextArea messageShow;/服务端的信息显示 JScrollPane messageScrollPane;/信息显示的滚动条 JTextField showStatus;/显示用户连接状态 JLabel sendToLabel,messageLabel; JTextField sysMessage;/服务端消息的发送 JB
5、utton sysMessageButton;/服务端消息的发送按钮 UserLinkList userLinkList;/用户链表 /建立菜单栏 JMenuBar jMenuBar = new JMenuBar(); /建立菜单组 JMenu serviceMenu = new JMenu (服务(V); /建立菜单项 JMenuItem portItem = new JMenuItem (端口设置(P),new ImageIcon(face/98.gif); JMenuItem startItem = new JMenuItem (启动服务(S),new ImageIcon(face/ic
6、on.gif); JMenuItem stopItem=new JMenuItem (停止服务(T),new ImageIcon(face/Uabrand.gif); JMenuItem exitItem=new JMenuItem (退出(X),new ImageIcon(face/messenger_big.gif); JMenu helpMenu=new JMenu (帮助(H); JMenuItem helpItem=new JMenuItem (帮助(H),new ImageIcon(face/HelpCenter.gif); /建立工具栏 JToolBar toolBar = ne
7、w JToolBar(); /建立工具栏中的按钮组件 JButton portSet;/启动服务端侦听 JButton startServer;/启动服务端侦听 JButton stopServer;/关闭服务端侦听 JButton exitButton;/退出按钮 /框架的大小 Dimension faceSize = new Dimension(400, 600); ServerListen listenThread; JPanel downPanel ; GridBagLayout girdBag; GridBagConstraints girdBagCon; /* * 服务端构造函数
8、*/ public ChatServer() init();/初始化程序 /添加框架的关闭事件处理 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); /设置框架的大小 this.setSize(faceSize); this.setVisible(true); /设置运行时窗口的位置 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation( (int) (screenSize.width - face
9、Size.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2); this.setResizable(false); this.setTitle(聊天室服务端); /设置标题 /为服务菜单栏设置热键V serviceMenu.setMnemonic(V); /为端口设置快捷键为ctrl+p portItem.setMnemonic (P); portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK);
10、/为启动服务快捷键为ctrl+s startItem.setMnemonic (S); startItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK); /为端口设置快捷键为ctrl+T stopItem.setMnemonic (T); stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK); /为退出设置快捷键为ctrl+x exitItem.setMnemonic (X
11、); exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X,InputEvent.CTRL_MASK); /为帮助菜单栏设置热键H helpMenu.setMnemonic(H); /为帮助设置快捷键为ctrl+p helpItem.setMnemonic (H); helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK); /* * 程序初始化函数 */ public void init() Container
12、 contentPane = getContentPane(); contentPane.setLayout(new BorderLayout(); /添加菜单栏 serviceMenu.add (portItem); serviceMenu.add (startItem); serviceMenu.addSeparator(); serviceMenu.add (stopItem); serviceMenu.addSeparator(); serviceMenu.add (exitItem); jMenuBar.add (serviceMenu); helpMenu.add (helpIte
13、m); jMenuBar.add (helpMenu); setJMenuBar (jMenuBar); /初始化按钮 portSet = new JButton(端口设置); startServer = new JButton(启动服务); stopServer = new JButton(停止服务 ); exitButton = new JButton(退出 ); /将按钮添加到工具栏 toolBar.add(portSet); toolBar.addSeparator();/添加分隔栏 toolBar.add(startServer); toolBar.add(stopServer);
14、toolBar.addSeparator();/添加分隔栏 toolBar.add(exitButton); contentPane.add(toolBar,BorderLayout.NORTH); /初始时,令停止服务按钮不可用 stopServer.setEnabled(false); stopItem .setEnabled(false); /为菜单栏添加事件监听 portItem.addActionListener(this); startItem.addActionListener(this); stopItem.addActionListener(this); exitItem.a
15、ddActionListener(this); helpItem.addActionListener(this); /添加按钮的事件侦听 portSet.addActionListener(this); startServer.addActionListener(this); stopServer.addActionListener(this); exitButton.addActionListener(this); combobox = new JComboBox(); combobox.insertItemAt(所有人,0); combobox.setSelectedIndex(0); m
16、essageShow = new JTextArea(); messageShow.setEditable(false); /添加滚动条 messageScrollPane = new JScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(new Dimension(400,400); messageScrollPane.revalidate(); show
17、Status = new JTextField(35); showStatus.setEditable(false); sysMessage = new JTextField(24); sysMessage.setEnabled(false); sysMessageButton = new JButton(); sysMessageButton.setText(发送); /添加系统消息的事件侦听 sysMessage.addActionListener(this); sysMessageButton.addActionListener(this); sendToLabel = new JLab
18、el(发送至:); messageLabel = new JLabel(发送消息:); downPanel = new JPanel(); girdBag = new GridBagLayout(); downPanel.setLayout(girdBag); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 0; girdBagCon.gridwidth = 3; girdBagCon.gridheight = 2; girdBagCon.ipadx = 5; girdBagCon.
19、ipady = 5; JLabel none = new JLabel( ); girdBag.setConstraints(none,girdBagCon); downPanel.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(sendToL
20、abel,girdBagCon); downPanel.add(sendToLabel); girdBagCon = new GridBagConstraints(); girdBagCon.gridx =1; girdBagCon.gridy = 2; girdBagCon.anchor = GridBagConstraints.LINE_START; girdBag.setConstraints(combobox,girdBagCon); downPanel.add(combobox); girdBagCon = new GridBagConstraints(); girdBagCon.g
21、ridx = 0; girdBagCon.gridy = 3; girdBag.setConstraints(messageLabel,girdBagCon); downPanel.add(messageLabel); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 1; girdBagCon.gridy = 3; girdBag.setConstraints(sysMessage,girdBagCon); downPanel.add(sysMessage); girdBagCon = new GridBagConstrain
22、ts(); girdBagCon.gridx = 2; girdBagCon.gridy = 3; girdBag.setConstraints(sysMessageButton,girdBagCon); downPanel.add(sysMessageButton); girdBagCon = new GridBagConstraints(); girdBagCon.gridx = 0; girdBagCon.gridy = 4; girdBagCon.gridwidth = 3; girdBag.setConstraints(showStatus,girdBagCon); downPane
23、l.add(showStatus); contentPane.add(messageScrollPane,BorderLayout.CENTER); contentPane.add(downPanel,BorderLayout.SOUTH); /关闭程序时的操作 this.addWindowListener( new WindowAdapter() public void windowClosing(WindowEvent e) stopService(); System.exit(0); ); /* * 事件处理 */ public void actionPerformed(ActionEv
24、ent 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.YES_OPTION) stopSer
25、vice(); 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 (j = JOptionPan
26、e.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() try serverSocket = new ServerSocket(p
27、ort,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); us
28、erLinkList = 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.
29、getCount(); int 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); sysMessage.setEnabled(false); mes