软件工程 实验报告.docx

上传人:b****6 文档编号:7159190 上传时间:2023-01-21 格式:DOCX 页数:34 大小:513.98KB
下载 相关 举报
软件工程 实验报告.docx_第1页
第1页 / 共34页
软件工程 实验报告.docx_第2页
第2页 / 共34页
软件工程 实验报告.docx_第3页
第3页 / 共34页
软件工程 实验报告.docx_第4页
第4页 / 共34页
软件工程 实验报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

软件工程 实验报告.docx

《软件工程 实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程 实验报告.docx(34页珍藏版)》请在冰豆网上搜索。

软件工程 实验报告.docx

软件工程实验报告

 

中南民族大学

 

学生实验报告

 

院系:

计算机科学学院

专业:

计算机科学与技术

年级:

2013级

课程名称:

软件工程

组员:

司少武(201321091135)

兰少雄(201321091136)

宇(201321091133)

纳洪泽(201321091132)

指导教师:

卫平

 

2015年12月26日

聊天室

1前言

1.1即时消息系统的研究现状

即时消息系统[1](InstantMessenger,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性能需求

运行环境:

WindowsAll

必要环境:

JDK1.5以上

硬件环境:

CPU400MHz以上,存64MB以上

3数据结构

3.1数据结构

此系统数据库中储存信息采用字符指针储存,将用户的信息用字符的形式进行处理并储存。

3.2逻辑结构

逻辑结构:

用户向服务器发送请求,服务器获取对方IP,若获取成功,用户向其发送消息,服务器将其处理并将其记录,然后将消息发给另一用户。

其E—R图如下所示:

2

将E-R图转化为关系模型,建立关系模型为:

消息(容,时间);

记录信息(容,储存信息);

服务器(服务器IP);

3

3.3功能模块划分

3.3.1结构框图

3.3.2程序流图

(1)整个系统流程图如下:

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设计

4.2.1.1模块算法

模块一:

发送消息:

发送消息函数:

sendmessages(char*p,InetAdrress);

发送消息后自动执行储存函数:

memorymessages(InetAdrress,char*p);

4.2.1.2流程图

4.2.2模块2设计

4.2.2.1模块算法

模块二:

接收消息:

接收消息消息函数:

*receivemessages(InetAdrress,char*p);

接收消息后自动执行储存消息函数:

memorymessages(InetAdrress,char*p);

4.2.2.2流程图:

4.2.3模块3设计

4.2.3.1模块算法

模块三:

消息记录查询:

执行发送请求函数:

*checknotes(InetAdrress,char*p);

删除记录函数:

deletenotes(InetAdrress);

自动执行接收消息函数:

*receivemessages(InetAdrress,char*p);

4.2.3.2

流程图:

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面向对象程序设计是一门应用广泛并且实用性极强的高级程序设计语言。

通过本次课程设计,我们对面向对象的基本思想有了进一步的理解,对项目的各个阶段的任务也有了一定的了解。

设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。

通过这次设计,使我们认识到体系的架构是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的的实现。

通过这次课程设计,对我们的逻辑思维能力是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但是我们学到了丰富的知识。

另外,此次课程设计也提高了我们的团对合作精神,让我们明白不是不能一个人能单独完成,而是要集思广益,结合更多的人的创意思维。

让我们大家深刻的体会到理论与实际相结合的重要性与微妙之处。

对于不同的想法我们都会集中讨论并对好的意见加以借鉴,在这个讨论的过程中,还更正了不少我们各自自身对于某个知识点的误区。

这次程序设计也是一个毅力的考验过程。

有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。

所以在这个过程不能过于急躁,要很有耐心将程序反复调试。

 

Appserver.java

importjava.io.*;

import.*;

importjava.util.*;

publicclassAppServerextendsThread{

privateServerSocketserverSocket;

privateServerFramesFrame;

privatestaticVectoruserOnline=newVector(1,1);

privatestaticVectorv=newVector(1,1);

publicAppServer(){

sFrame=newServerFrame();

try{

serverSocket=newServerSocket(1001);

//获取服务器的主机名和IP地址

InetAddressaddress=InetAddress.getLocalHost();

sFrame.txtServerName.setText(address.getHostName());

sFrame.txtIP.setText(address.getHostAddress());

sFrame.txtPort.setText("1001");

}catch(IOExceptione){

fail(e,"不能启动服务!

");

}

sFrame.txtStatus.setText("已启动...");

this.start();//启动线程

}

publicstaticvoidfail(Exceptione,Stringstr){

System.out.println(str+"。

"+e);

}

publicvoidrun(){

try{

while(true){

Socketclient=serverSocket.accept();

newConnection(sFrame,client,userOnline,v);System.out.println("userLength:

"+userLength);

}

}catch(IOExceptione){

fail(e,"不能监听!

");

}

}

publicstaticvoidmain(Stringargs[]){

newAppServer();

}

}

Login.java

import*;

publicclassLoginextendsJFrameimplementsActionListener{

privatestaticfinallongserialVersionUID=-8965773902056088264L;

privateJPanelpnlLogin;

privateuttonbtnLogin,btnRegister,btnExit;

privateJLabellblServer,lblUserName,lblPassword,lblLogo;

privateJTextFieldtxtUserName,txtServer;

privateJPasswordFieldpwdPassword;

privateStringstrServerIp;

privateDimensionscrnsize;

privateToolkittoolkit=Toolkit.getDefaultToolkit();

publicLogin(){

super("登录[HappyChat]聊天室");

pnlLogin=newJPanel();

this.getContentPane().add(pnlLogin);

lblServer=newJLabel("服务器(S):

");

lblUserName=newJLabel("用户名(U):

");

lblPassword=newJLabel("口令(P):

");

txtServer=newJTextField(20);

txtServer.setText("127.0.0.1");

txtUserName=newJTextField(20);

pwdPassword=newJPasswordField(20);

btnLogin=newutton("登录(L)");

btnLogin.setToolTipText("登录到服务器");

btnLogin.setMnemonic('L');

btnRegister=newutton("注册(R)");

btnRegister.setToolTipText("注册新用户");

btnRegister.setMnemonic('R');

btnExit=newutton("退出(X)");

btnExit.setToolTipText("退出系统");

btnExit.setMnemonic('X');

pnlLogin.setLayout(null);

pnlLogin.setBackground(newColor(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);

Fontfontstr=newFont("宋体",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);

Iconlogo1=newImageIcon("images\\loginlogo.jpg");

lblLogo=newJLabel(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);

Imageimg=toolkit.getImage("images\\appico.jpg");

setIconImage(img);

btnLogin.addActionListener(this);

btnRegister.addActionListener(this);

btnExit.addActionListener(this);

SuppressWarnings({"deprecation","static-access"})

publicvoidactionPerformed(ActionEventae){

Objectsource=ae.getSource();

if(source.equals(btnLogin)){

if(txtUserName.getText().equals("")

||pwdPassword.getText().equals("")){

JOptionPaneop1=newJOptionPane();

op1.showMessageDialog(null,"用户名或密码不能为空");

}else{

strServerIp=txtServer.getText();

login();

}

}

if(source.equals(btnRegister)){

strServerIp=txtServer.getText();

this.dispose();

newRegister(strServerIp);

}

if(source==btnExit){

System.exit(0);

}

}

SuppressWarnings("deprecation")

publicvoidlogin(){

Customerdata=newCustomer();

data.custName=txtUserName.getText();

data.custPassword=pwdPassword.getText();

try{

SockettoServer;

toServer=newSocket(strServerIp,1001);

ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer

.getOutputStream());

streamToServer.writeObject((Customer)data);

BufferedReaderfromServer=newBufferedReader(

newInputStreamReader(toServer.getInputStream()));

Stringstatus=fromServer.readLine();

if(status.equals("登录成功")){

newChatRoom((String)data.custName,strServerIp);

this.dispose();

streamToServer.close();

fromServer.close();

toServer.close();

}else{

JOptionPane.showMessageDialog(null,status);

streamToServer.close();

fromServer.clos

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1