《Java程序设计》课程设计大作业服务端聊天系统.doc
20112012学年第一学期Java程序设计课程大作业题目: 服务端聊天系统 专业: 计算机 班级: 计算机1班 学号: 090400224 姓名: 马英俊 教师: 杨树林 日期:2011年 12月 22 日项目内容单项分值总分选题1题目明确,系统功能较集中482题目难度适宜,有一定的综合性4功能实现3功能完整,能够正确运行6244模块划分合理,程序结构清晰65界面设计合理、易用、协调66设计与实现程序6规范性及文档7代码规范性及注释5108文档内容齐全,格式规范5总体效果9完成总体质量61210软件功能及技术水平6答辩11讲解清楚明了,功能演示流畅66评语总分一 课程设计目的JAVA程序设计是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践是必不可少的一个重要环节。JAVA程序设计的设计目的是加深对理论内容的理解和掌握,更加系统地掌握程序设计及其在开发中的广泛应用,基本方法及技巧,为综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。二 课程设计的实验环境运行windows 2007或XP以上微机系统,JDK,NETBEAN。三 课程设计主要内容Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了。服务端聊天系统是一个方便于两端用户沟通的软件,通过输入侦听方的端口号(例如:8888)来启动服务。当服务启动时,可进行聊天;当停止服务时,聊天信息将不再接受。四 详细设计程序详细设计代码如下:package org.Adam;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*;import org.Adam.PortConf;import org.Adam.ServerListen;/* * * author Administrator */public class ChatServer extends JFrame implements ActionListenerpublic static int port = 8888;/服务端的侦听端口ServerSocket serverSocket;/服务端SocketImage icon;/程序图标JComboBox combobox;/选择发送消息的接受者JTextArea messageShow;/服务端的信息显示JScrollPane messageScrollPane;/信息显示的滚动条JTextField showStatus;/显示用户连接状态JLabel sendToLabel,messageLabel;JTextField sysMessage;/服务端消息的发送JButton 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 JMenuItem ("停止服务(T)");JMenuItem exitItem=new JMenuItem ("退出(X)");JMenu helpMenu=new JMenu ("帮助(H)");JMenuItem helpItem=new JMenuItem ("帮助(H)");/建立工具栏JToolBar toolBar = new JToolBar();/建立工具栏中的按钮组件JButton portSet;/启动服务端侦听JButton startServer;/启动服务端侦听JButton stopServer;/关闭服务端侦听JButton exitButton;/退出按钮/框架的大小Dimension faceSize = new 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 = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - faceSize.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2);this.setResizable(false);this.setTitle("聊天室服务端"); /设置标题/程序图标icon = getImage("icon.gif");this.setIconImage(icon); /设置程序图标this.setVisible(true);/* * 程序初始化函数 */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);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);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.addActionListener(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);messageShow = 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();showStatus = 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 JLabel("发送至:");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.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(sendToLabel,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.gridx = 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 GridBagConstraints();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);downPanel.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(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.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口设置/调出端口设置的对话框PortConf portConf = new PortConf(this);portConf.setVisible(true);else if (obj = exitButton | 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 if (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,combobox,messageShow,showStatus,userLinkList);listenThread.start();/* * 关闭服务端 */public void stopService()try/向所有人发送服务器关闭的消息sendStopToAll();listenThread.isStop = true;serverSocket.close();int count = userLinkList.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);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(node = 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 +;continue;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 = 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();catch(Exception e)/System.out.println("!"+e);sysMessage.setText("");/将发送消息栏的消息清空/* * 通过给定的文件名获得图像 */Image getImage(String filename) URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();URL url = null;Image image = null;url = urlLoader.findResource(filename);image = Toolkit.getDefaultToolkit().getImage(url);MediaTracker mediatracker = new MediaTracker(this);try mediatracker.addImage(image, 0);mediatracker.waitForID(0);catch (InterruptedException _ex) image = null;if (mediatracker.isErrorID(0) image = null;return image;public static void main(String args) ChatServer app = new ChatServer();五 测试分析服务端聊天系统初始化界面如图(1)所示。图(1)服务端聊天系统端口设置界面如图(2)所示。 图(2)服务端聊天系统启动服务界面如图(3)所示。 图(3)服务端聊天系统发送消息结果如图(4)所示。 图(4)服务端聊天系统停止服务界面如图(5)(6)所示。图(5)图(6)服务端聊天系统退出界面如图(7)所示。图(7)六 课程设计总结通过这学期学习JAVA语言,我学到很多知识,当然在这期间遇到的困难也数不胜数。我想做些复杂的程序,但实在是能力有限,最后终于决定做服务端聊天系统。.这个服务端聊天系统虽然理论上来讲应该很简单,但当我真正着手的时候才发现,原来自己会的知识太少了。刚刚开始什么我什么都不太懂,于是我参阅了大量的资料,也不停的向同学们请教,终于渐渐的让我从刚开始连如何运行程序,甚至类的作用等一些最基本的东西都不清楚到最后通过努力终于把程序成功的做出来。经过编写这个服务端聊天系统,我认识到无论什么事情都应该注意细节,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己的严谨性,同时还可以为以后的工作积累经验。除此之外让我对JAVA编程语言又有了更深一步的了解。总之,通过这次课程设计真的让我学到了很多.。