




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与技术学院2012届学生毕业实习报告专 业: 网络工程 班 级: 0802班 姓 名: 张龙 指导教师: 金瑜 实习单位: 武汉至诚无限科技发展有限公司 实习时间: 2012.2.13-2012.3.2 一、项目简介随着计算机网络的不断普及和高带发展,人们对网络的使用越来越频繁,对网络应用的需求也越来越大.网络即时通讯系统已经被大家普遍认同、使用,甚至重度使用,像我们大家非常熟悉的QQ软件,就是一个非常典型的聊天软件,尤其深受国内的广大用户的喜爱,类似的软件还有中国移动的飞信,新浪的UC等等。信息化是当今世界经济和社会发展的大趋势。这些即时通讯工具的应用使得我们的沟通和交流的效率到了很大的提高。本文围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对计算器程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。在编程我们使用的java语言,是目前比较流行的编程语言。在当今这个网络的时代,java语言在网络编程方面的优势使得网络编程有了更好的选择。Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。二、需求分析在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个局域网的网络聊天工具的;而且通过制作该程序还能更好的学习网络软件编程知识.1、 功能要求:(1)登录功能.(2)客户可以通过服务器转发,实现一对一和多对多聊天.(3)实现呼叫功能.(4)客户端程序应该可以实时显示目前其它用户的状态.三、概要设计1、主要模块的算法描述1.1、聊天室服务器端设计:ActionListenerChatServer-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ ChatServer():public+init():public void +startService():public void+stopService():public void +sendStopToAll():public void+sendMsgToAll(String):public void+ sendSystemMessage():public voidJFrameThreadServerListen- server: ServerSocket- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)Thread1.2、聊天室客户端设计:ActionListenerChatClient-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ ChatClient():public+init():public void +Connect():public void+DisConnect():public void +SendMessage():public voidJFrameClientReceive- socket: Socket-output:ObjectOutputStream-input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField )2、功能模块的流程图2.1、服务器端运行ChatServer.java程序 生成界面 启动服务器设计服务器界面使用端口初始化服务器套接字将客户socket信息写入list框启动线程,用ServerListen ()监听聊天室 刷新客户端信息实例化一个client线程类 一个对应一个客户连接是否退出?关闭服务器是2.2、客户端设计客户端界面 并初始化运行ChatClient.java 连接服务器 生成界面用户是否请求连接是将客户端线程实例化启动线程 监听服务器传来的信息请求断开连接否是运行disconnect()方法是定义并实例化一个字符缓冲存储信息 用打印流发送信息线程处理服务器传来的信息发送聊天消息四、详细设计2、模块简介2.1、聊天室服务端主要包括7个文件,它们的功能如下:(1)ChatServer.java:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。(2)ServerListen.java:该类实现服务端用户上线与下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。(3)ServerReceive.java:该类是实现服务器端的消息的收发的类。该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。(4)PortConf.java:该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类。(5)Node.java:用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node类的功能相当。(6)UserLinkList.java:用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。(7)Help.java:服务端程序的帮助类。2.2、聊天室客户端主要包括5个文件,它们的功能如下:(1)ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。(2)ClientReceive.java:该类是实现服务器端与客户端消息收发的类。(3)ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。(4)UserConf.java:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。(5)Help.java:客户端程序的帮助类。五、功能截图1、服务端启动:2、 客户端设置:3、客户端启动:4、聊天通信:(1)群聊和单聊(2)悄悄话5、帮助:(1)服务器端帮助(2)客户端帮助六、核心代码1、服务器端(1)ChatServer.java: import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import .*;import java.io.*;/* * 聊天服务端的主框架类 */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),new ImageIcon(face/98.gif);JMenuItem startItem = new JMenuItem (启动服务(S),new ImageIcon(face/icon.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 = 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);this.setVisible(true);/设置运行时窗口的位置Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - faceSize.getWidth() / 2, (int) (screenSize.height - faceSize.getHeight() / 2);this.setResizable(false);this.setTitle(聊天室服务端); /设置标题/为服务菜单栏设置热键VserviceMenu.setMnemonic(V);/为端口设置快捷键为ctrl+pportItem.setMnemonic (P);portItem.setAccelerator (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 (KeyEvent.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,InputEvent.CTRL_MASK);/* * 程序初始化函数 */public void init()Container 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 (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.show();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.show();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();/将发送消息栏的消息清空public static void main(String args) ChatServer app = new ChatServer();(2)ServerListen.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import java.io.*;import .*;/* * 服务端的侦听类 */public class ServerListen extends Thread ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList 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.textfield = textfield;this.userLinkList = userLinkList;isStop = false;public void run()while(!isStop & !server.isClosed()tryclient = new Node();client.socket = server.accept();client.output = new ObjectOutputStream(client.socket.getOutputStream();client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream();client.username = (String)client.input.readObject();/显示提示信息combobox.addItem(client.username);userLinkList.addUser(client);textarea.append(用户 + client.username + 上线 + n);textfield.setText(在线用户 + userLinkList.getCount() + 人n);recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.start();catch(Exception e)(3)ServerReceive.javaimport javax.swing.*;import java.io.*;import .*;/* * 服务器收发消息的类 */public class ServerReceive extends Thread JTextArea textarea;JTextField textfield;JComboBox combobox;Node client;UserLinkList userLinkList;/用户链表public boolean isStop;public ServerReceive(JTextArea 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 & !client.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.readObject();String msg = client.username + + action+ 对 + toSomebody + 说 : + message+ n;if(status.equalsIgnor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届内蒙古乌海市高三化学第一学期期中综合测试模拟试题含解析
- 2025技师仓储管理试题及答案
- 2025年注册验船师资格考试(A级船舶检验专业案例分析)强化训练试题及答案一
- 2025年注册验船师资格考试(B级船舶检验法律法规)冲刺试题及答案一
- 2025年高级云计算开发工程师认证指南及模拟试题解析
- 2025年全国养老护理员(高级)技能证书理论考试试题(附答案)
- 国际银行业务试题及答案
- 2025年政府驻穗办事处招聘考试综合备考指南与技巧
- 2025年初级智能制造工程师笔试模拟试题与答案
- 2025年电力电子工程师专业模拟题及答案指南
- 2025年动物(兽医)微生物实验(教学实践)报告
- 离心机验证方案
- 《劳动法常识(第3版)》中职全套教学课件
- 2025年山东水发集团有限公司招聘笔试参考题库含答案解析
- 环境卫生学监测及采样方法介绍(院感培训)
- 《制造业成本核算》课件
- 《植物种植要领》课件
- 分子生物学课件第一章医学分子生物学绪论
- 某港池航道疏浚和吹填造陆工程施工组织设计
- 质量为纲-华为公司质量理念与实践
- 新媒体视频节目制作全套教学课件
评论
0/150
提交评论