软件工程 实验报告_第1页
软件工程 实验报告_第2页
软件工程 实验报告_第3页
软件工程 实验报告_第4页
软件工程 实验报告_第5页
免费预览已结束,剩余26页可下载查看

下载本文档

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

文档简介

-院 系: 计算机科学学院 专 业: 计算机科学与技术 年 级: 2013级 课程名称: 软件工程 组 员: 司少武 (201321091135) 兰少雄 (201321091136) 张宇 (201321091133) 纳洪泽(201321091132)指导教师: 刘卫平 2015年 12月 26 日聊天室1 前言1.1 即时消息系统的研究现状 即时消息系统1(Instant Messenger,IM)是一种在后 PC 时代兴起的,以 Internet 网络为基础的,允许交互双方即时地传送文字、语音、视频等信息,能够跟踪网络用户在线状态的网络应用软件。即时消息系统产生有着深刻的社会原因:人们都有渴望社交,获得社会尊重、实现自我的需求,这正是即时消息软件风行的原动力,而物质文明的日益发达所带来副作用,又使得人们习惯与周围的人保持距离,以致人们更愿意对陌生人敞开心扉,在网络中可以跨越年龄、身份、行业、地域的限制,达到人与人、人与信息之间的零距离交流。从这点上讲,即时消息系统的出现改变了人们的沟通方式和交友文化,大大拓展了个人生活交流的空间。1.2本工程的主要内容 随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持, 而聊天室是人们最常见, 最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求, 且具有脱离数据库技术方法, 易于维护和更新的特点。2 需求分析本系统所要实现的主要功能是当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。2.1 业务需求1. 与聊天室成员一起聊天。2. 可以与聊天室成员私聊。3. 可以改变聊天内容风格。4. 用户注册(含头像)、登录。5. 服务器监控聊天内容。 6. 服务器过滤非法内容。7. 服务器发送通知。8. 服务器踢人。9. 保存服务器日志。 10.保存用户聊天信息。2.2 系统功能模块2.2.1 服务器端1.处理用户注册2.处理用户登录3.处理用户发送信息4.处理用户得到信息5.处理用户退出2.2.2 客户端1.用户注册界面及结果2.用户登录界面及结果3.用户发送信息界面及结果4.用户得到信息界面及结果5.用户退出界面及结果2.3 性能需求运行环境:Windows All必要环境:JDK 1.5 以上硬件环境:CPU 400MHz以上,内存64MB以上3数据结构3.1 数据结构 此系统数据库中储存信息采用字符指针储存,将用户的信息用字符的形式进行处理并储存。3.2 逻辑结构 逻辑结构:用户向服务器发送请求,服务器获取对方IP,若获取成功,用户向其发送消息,服务器将其处理并将其记录,然后将消息发给另一用户。其ER图如下所示:2消息发送服务器记录记录信息内容时间内容储存信息图1.E-R图服务器IP将E-R图转化为关系模型,建立关系模型为:消息(内容,时间);记录信息(内容,储存信息);服务器(服务器IP); 33.3 功能模块划分3.3.1结构框图聊天系统发送消息接受消息服务器获取IP服务器发送消息保存信息时钟图2.结构图3.3.2程序流图(1)整个系统流程图如下: 用户发送的消息或请求结束服务器接收信息查询请求?向用请求户发送消息保存信息向目标用户发送消息是否图3.系统程序流程图 3.3.3模块功能分析及外部设计模块功能分析:(1)发送消息:用户选择好友,如果好友在线,服务器便获取其IP地址,用户打开消息盒编辑需要发送的消息,然后发送,服务器接受此消息,并处理记录到记录表中,然后将其发送给好友。(2)接收消息:好友发送的信息通过服务器处理并发送到本用户,如果设置为接收消息,则系统提示并可以打开查看此消息,否则服务器不将此消息发送到本用户。(3)消息记录查询:用户向服务器发送查询请求,服务器作出响应并将最近消息记录发送到此用户。外部设计:交互设计是面向最终用户的设计,是软件的外部设计,交互设计要求在研究软件技术问题的同时对人加以研究。用户是什么样的人?用户怎样与新的计算机系统进行交互?用户怎样解释系统产生的信息?用户对系统有哪些期望?这些问题仅仅是需要在用户交互设计时必须询问和回答的问题。作为点对点的聊天系统,作为服务使用者得用户和提供服务的聊天系统有着互动和交换信息的过程,用户有请求,系统就必须有应答,需要双方参与。(1)当用户选择好友向其发送消息时,点击好友,向服务器发送请求,如果好友在线,服务器自动获取好友IP并建立双方的连接,进行聊天。否则应该提示好友不在,不能聊天或发送离线信息。(2)用户查询聊天信息时,向服务器发送查询请求,服务器作出响应并将相应记录发送到此用户界面。通过对产品的界面和行为进行交互设计,让产品和它的使用者之间建立一种有机关系,从而可以有效的达到使用者的目标,而好的交互设计会使系统和使用者之间更好的交互,达到“愉悦地合作”,这是交互设计的最终目的。4 详细设计4.1 类定义ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。4.2 主要模块内部设计此点对点聊天系统主要包括以下模块:(1)发送消息;(2)接收消息;(3)查询消息记录。每个模块的主要执行功能函数及算法如下。4.2.1模块1设计 模块算法模块一:发送消息: 发送消息函数:send messages(char *p,InetAdrress); 发送消息后自动执行储存函数:memory messages(InetAdrress,char *p); 流程图 用户输入要发送的信息是否在线?获取IP发送消息保存记录结束是否图4.发送消息流程图4.2.2 模块2设计 模块算法模块二:接收消息: 接收消息消息函数: *receive messages(InetAdrress,char *p); 接收消息后自动执行储存消息函数:memory messages(InetAdrress,char *p); 流程图: 好友发送的消息是否接收打开消息保存消息记结束图5.接收消息流程图是否4.2.3 模块3设计 模块算法模块三:消息记录查询: 执行发送请求函数:*check notes(InetAdrress,char *p); 删除记录函数:delete notes(InetAdrress); 自动执行接收消息函数:*receive messages(InetAdrress,char *p); 流程图: 用户发送的查询请求是否存在记录服务器向其发送记录读取记录结束是否图6.查询记录流程图5 测试分析与截图在实现本系统的同时每设计一个模块,就实现模块测试,使其能实现该函数需要实现的功能,此阶段为白盒测试。此阶段将此模块作为单独的一个实体来测试,而且比较容易实际检验模块正确性的测试方案,保证每个模块单元的正确运行,来确定编码和详细设计的错误。 然后集成测试。集成测试阶段,先将单元测试成功的模块放在一起形成一个子系统来测试,以解决模块间的协调和通信问题。然后将子系统测试通过的模块放在一起形成一个完整的系统测试,检验功能,来发现需求报告中的错误。5.1 测试用例为了检验此系统的正确性,设计了以下的一些测试用例:(1)登录注册 (2)发送和接收消息A:你好B:你好 (3)保存聊天记录 (4)保存聊天记录 (5)保存服务器日志 (6)服务器踢人不同的测试数据发现程序错误的能力差别很大,为了提高测试效率低测试成本,应该选择高效的测试用例,数据尽量少,做到尽可能完备的测试就可以了。5.2 测试结果 5.2.1登录界面 5.2.2注册界面5.2.3 服务器5.2.4 聊天室聊天对所有人,私人聊天,系统提示信息。5.2.5 聊天记录保存5.2.6服务器日志保存5.2.7服务器踢人5.2.8时钟6 结束语Java面向对象程序设计是一门应用广泛并且实用性极强的高级程序设计语言。通过本次课程设计,我们对面向对象的基本思想有了进一步的理解,对项目的各个阶段的任务也有了一定的了解。设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。通过这次设计,使我们认识到体系的架构是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的的实现。通过这次课程设计,对我们的逻辑思维能力是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但是我们学到了丰富的知识。另外,此次课程设计也提高了我们的团对合作精神,让我们明白不是不能一个人能单独完成,而是要集思广益,结合更多的人的创意思维。让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。对于不同的想法我们都会集中讨论并对好的意见加以借鉴,在这个讨论的过程中,还更正了不少我们各自自身对于某个知识点的误区。这次程序设计也是一个毅力的考验过程。有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。所以在这个过程不能过于急躁,要很有耐心将程序反复调试。App server.javaimport java.io.*;import .*;import java.util.*;public class AppServer extends Thread private ServerSocket serverSocket;private ServerFrame sFrame;private static Vector userOnline = new Vector(1, 1);private static Vector v = new Vector(1, 1);public AppServer() sFrame = new ServerFrame();try serverSocket = new ServerSocket(1001);/ 获取服务器的主机名和IP地址InetAddress address = InetAddress.getLocalHost();sFrame.txtServerName.setText(address.getHostName();sFrame.txtIP.setText(address.getHostAddress();sFrame.txtPort.setText(1001); catch (IOException e) fail(e, 不能启动服务!);sFrame.txtStatus.setText(已启动.);this.start(); / 启动线程public static void fail(Exception e, String str) System.out.println(str + 。 + e);public void run() try while (true) Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); System.out.println(userLength:+userLength); catch (IOException e) fail(e, 不能监听!);public static void main(String args) new AppServer();Login.javaimport*;public class Login extends JFrame implements ActionListener private static final long serialVersionUID = -8965773902056088264L;private JPanel pnlLogin;private JButton btnLogin, btnRegister, btnExit;private JLabel lblServer, lblUserName, lblPassword, lblLogo;private JTextField txtUserName, txtServer;private JPasswordField pwdPassword;private String strServerIp;private Dimension scrnsize;private Toolkit toolkit = Toolkit.getDefaultToolkit();public Login() super(登录HappyChat聊天室);pnlLogin = new JPanel();this.getContentPane().add(pnlLogin);lblServer = new JLabel(服务器(S):);lblUserName = new JLabel(用户名(U):);lblPassword = new JLabel(口 令(P):);txtServer = new JTextField(20);txtServer.setText();txtUserName = new JTextField(20);pwdPassword = new JPasswordField(20);btnLogin = new JButton(登录(L);btnLogin.setToolTipText(登录到服务器);btnLogin.setMnemonic(L);btnRegister = new JButton(注册(R);btnRegister.setToolTipText(注册新用户);btnRegister.setMnemonic(R);btnExit = new JButton(退出(X);btnExit.setToolTipText(退出系统);btnExit.setMnemonic(X);pnlLogin.setLayout(null);pnlLogin.setBackground(new Color(52, 130, 203);lblServer.setBounds(50, 100, 100, 30);txtServer.setBounds(150, 100, 120, 25);lblUserName.setBounds(50, 130, 100, 30);txtUserName.setBounds(150, 130, 120, 25);lblPassword.setBounds(50, 160, 100, 30);pwdPassword.setBounds(150, 160, 120, 25);btnLogin.setBounds(50, 200, 80, 25);btnRegister.setBounds(130, 200, 80, 25);btnExit.setBounds(210, 200, 80, 25);Font fontstr = new Font(宋体, Font.PLAIN, 12);lblServer.setFont(fontstr);txtServer.setFont(fontstr);lblUserName.setFont(fontstr);txtUserName.setFont(fontstr);lblPassword.setFont(fontstr);pwdPassword.setFont(fontstr);btnLogin.setFont(fontstr);btnRegister.setFont(fontstr);btnExit.setFont(fontstr);lblUserName.setForeground(Color.BLACK);lblPassword.setForeground(Color.BLACK);btnLogin.setBackground(Color.ORANGE);btnRegister.setBackground(Color.ORANGE);btnExit.setBackground(Color.ORANGE);pnlLogin.add(lblServer);pnlLogin.add(txtServer);pnlLogin.add(lblUserName);pnlLogin.add(txtUserName);pnlLogin.add(lblPassword);pnlLogin.add(pwdPassword);pnlLogin.add(btnLogin);pnlLogin.add(btnRegister);pnlLogin.add(btnExit);Icon logo1 = new ImageIcon(imagesloginlogo.jpg);lblLogo = new JLabel(logo1);lblLogo.setBounds(0, 0, 340, 66);pnlLogin.add(lblLogo);setResizable(false);setSize(340, 260);setVisible(true);scrnsize = toolkit.getScreenSize();setLocation(scrnsize.width / 2 - this.getWidth() / 2, scrnsize.height/ 2 - this.getHeight() / 2);Image img = toolkit.getImage(imagesappico.jpg);setIconImage(img);btnLogin.addActionListener(this);btnRegister.addActionListener(this);btnExit.addActionListener(this);SuppressWarnings( deprecation, static-access )public void actionPerformed(ActionEvent ae) Object source = ae.getSource();if (source.equals(btnLogin) if (txtUserName.getText().equals()| pwdPassword.getText().equals() JOptionPane op1 = new JOptionPane();op1.showMessageDialog(null, 用户名或密码不能为空); else strServerIp = txtServer.getText();login();if (source.equals(btnRegister) strServerIp = txtServer.getText();this.dispose();new Register(strServerIp);if (source = btnExit) System.exit(0); SuppressWarnings(deprecation)public void login() Customer data = new Customer();data.custName = txtUserName.getText();data.custPassword = pwdPassword.getText();try Socket toServer;toServer = new Socket(strServerIp, 1001);ObjectOutputStream streamToServer = new ObjectOutputStream(toServer.getOutputStream();streamToServer.writeObject(Customer) data);BufferedReader fromServer = new BufferedReader(new InputStreamReader(toServer.getInputStream();String status = fromServer.readLine();if (status.equals(登录成功) new ChatRoom(String) data.custName, strServerIp);this.dispose();streamToServer.close();fromServer.close();toServer.close(); else JOptionPane.showMessageDialog(null, status);streamToServer.close();fromServer.close();toServer.close(); catch (ConnectException e1) JOptionPane.showMessageDialog(null, 未能建立到指定服务器的连接!); catch (InvalidClassException e2) JOptionPane.showMessageDialog(null, 类错误!); catch (NotSerializableException e3) JOptionPane.showMessageDialog(null, 对象未序列化!); catch (IOException e4) JOptionPane.showMessageDialog(null, 不能写入到指定服务器!); public static void main(String args) new Login(); Register.java import *;public class Register extends JFrame implements ActionListenerprivate JComboBox comboBox;private static final long serialVersionUID = 9019746127517522180L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName,txtAge,txtEmail;JPasswordField pwdUserPassword,pwdConfirmPass;JRadioButton rbtnMale,rbtnFemale;ButtonGroup btngGender; JButton btnOk,btnCancel,btnClear;String strServerIp;final JLabel headLabel = new JLabel();Dimension scrnsize; Toolkit toolkit=Toolkit.getDefaultToolkit();public Register(String ip)super(HappyChat聊天室注册窗口);strServerIp=ip;pnlRegister=new JPanel();this.getContentPane().add(pnlRegister);lblUserName=new JLabel(用 户 名:);lblGender=new JLabel(性 别:);lblAge=new JLabel(年 龄:);lblPassword=new JLabel(口 令:);lblConfirmPass=new JLabel(确认口令:);lblEmail=new JLabel(电子邮件:);txtUserName=new JTextField(30);txtEmail=new JTextField(30);txtAge=new JTextField(10);pwdUserPassword=new JPasswordField(30);pwdConfirmPass=new JPasswordField(30);rbtnMale=new JRadioButton(男,true);rbtnFemale=new JRadioButton(女); btngGender=new ButtonGroup(); btnOk=new JButton(确定(O); btnOk.setMnemonic(O); btnOk.setToolTipText(保存注册信息);btnCancel=new JButton(返回(B);btnCancel.setMnemonic(B);btnCancel.setToolTipText(返回登录窗口);btnClear=new JButton(清空(L);btnClear.setMnemonic(L);btnClear.setToolTipText(清空注册信息);pnlRegister.setLayout(null); pnlRegister.setBackground(new Color(52,130,203);lblUserName.setBounds(30,80,100,30);txtUserName.setBounds(110,85,120,20);lblPassword.setBounds(30,141,100,30);pwdUserPassword.setBounds(110,146,120,20);lblConfirmPass.setBounds(30,166,100,30);pwdConfirmPass.setBounds(110,171,120,20);lblGender.setBounds(30,191,100,30);rbtnMale.setBounds(110,196,60,20);rbtnFemale.setBounds(190,196,60,20);lblAge.setBounds(30,216,100,30);txtAge.setBounds(110,221,120,20);lblEmail.setBounds(30,241,100,30);txtEmail.setBounds(110,246,120,20); btnOk.setBounds(246,166,80,25); btnCancel.setBounds(246,201,80,25); btnClear.setBounds(246,241,80,25);Font fontstr=new Font(宋体,Font.PLAIN,12);lblUserName.setFont(fontstr); lblGender.setFont(fontstr);lblPassword.setFont(fontstr);lblConfirmPass.setFont(fontstr);lblAge.setFont(fontstr);lblEmail.setFont(fontstr); rbtnMale.setFont(fontstr);rbtnFemale.setFont(fontstr);txtUserName.setFont(fontstr);txtEmail.setFont(fontstr);btnOk.setFont(fontstr);btnCancel.setFont(fontstr);btnClear.setFont(fontstr);lblUserName.setForeground(Color.BLACK);lblGender.setForeground(Color.BLACK);lblPassword.setForeground(Color.BLACK);lblAge.setForeground(Color.BLACK);lblConfirmPass .setForeground(Color.BLACK);lblEmail.setForeground(Color.BLACK);rbtnMale.setForeground(Color.BLACK);rbtnFemale.setForeground(Color.BLACK);rbtnMale.setBackground(Color.white);rbtnFemale.setBackground(Color.white);btnOk.setBackground(Color.ORANGE); btnCancel.setBackground(Color.ORANGE); btnClear.setBackground(Color.ORANGE);rbtnMale.setOpaque(false); rbtnFemale.setOpaque(false);pnlRegister.add(lblUserName);pnlRegister.add(lblGender);pnlRegister.add(lblPassword);pnlRegister.add(lblConfirmPass);pnlRegister.add(lblEmail);pnlRegister.add(lblAge);pnlRegister.add(txtAge);pnlRegister.add(txtUserName);pnlRegister.add(txtEmail);pnlRegister.add(pwdUserPassword);pnlRegister.add(pwdConfirmPass);pnlRegister.add(btnOk);pnlRegister.add(btnCancel);pnlRegister.add(btnClear);pnlRegister.add(rbtnMale);pnlRegister.add(rbtnFemale);btngGender.add(rbtnMale); btngGender.add(rbtnFemale); Icon logo = new ImageIcon(imagesregisterlogo.jpg); logoPosition = new JLabel(logo);logoPosition.setBounds(0, 0, 360,78);pnlRegister.add(logoPosition); this.setSize(360,313);this.setVisible(true);this.setResizable(false); scrnsize=toolkit.getScreenSize(); this.setLocation(scrnsize.width/2-this.getWidth()/2, scrnsize.height/2-this.getHeight()/2);Image img=toolkit.getImage(imagesappico.jpg); this.setIconImage(img);btnOk .addActionListener(this);btnCancel.addActionListener(this);btnClear .addActionListener(this);final JLabel label = new JLabel();label.setText(头 像:);label.setBounds(30, 120, 60, 15);pnlRegister.add(label);comboBox = new JComboBox();comboBox.setAutoscrolls(true);comboBox.setModel(new DefaultComboBoxModel(new String 1, 2, 3);comboBox.setBounds(110, 116, 47, 23);comboBox.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent arg0) Icon logo = new ImageIcon(face+comboBox.getSelectedItem().toString()+.jpg);headLabel.setIcon(logo););pnlRegister.add(comboBox);headLabel.setHorizontalAlignment(SwingConstants.CENTER);/.setIcon(SwingResourceManager.getIcon(Register.class, face/1.jpg);headLabel.setIcon(new ImageIcon(face/1.JPG);headLabel.setBounds(247, 88, 74, 72);pnlRegister.add(headLabel); public void actionPerformed(ActionEvent ae)Object source=new Object(); source=ae.getSource(); if (source.equals(btnOk) register(); if (source.equals(btnCancel) new Login(); this.dispose(); if (source.equals(btnClear) txtUserName.setText(); pwdUserPassword.setText(); pwdConfirmPass.setText(); txtAge.setText(); txtEmail.setText(); SuppressWarnings( deprecation, static-access )public void register() Register_Customer data=new

温馨提示

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

评论

0/150

提交评论