软件工程 实验报告Word格式文档下载.docx
《软件工程 实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《软件工程 实验报告Word格式文档下载.docx(34页珍藏版)》请在冰豆网上搜索。
![软件工程 实验报告Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-2/1/0d0f0da3-ce27-4d72-97f2-78901b617dd6/0d0f0da3-ce27-4d72-97f2-78901b617dd61.gif)
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.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流程图
用户输入要发送的信息
是否在线?
获取IP
发送消息
保存记录
图4.发送消息流程图
4.2.2模块2设计
4.2.2.1模块算法
模块二:
接收消息:
接收消息消息函数:
*receivemessages(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(){
while(true){
Socketclient=serverSocket.accept();
newConnection(sFrame,client,userOnline,v);
System.out.println("
userLength:
+userLength);
}
不能监听!
publicstaticvoidmain(Stringargs[]){
newAppServer();
}
Login.java
import*;
publicclassLoginextendsJFrameimplementsActionListener{
privatestaticfinallongserialVersionUID=-8965773902056088264L;
privateJPanelpnlLogin;
privateJButtonbtnLogin,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=newJButton("
登录(L)"
btnLogin.setToolTipText("
登录到服务器"
btnLogin.setMnemonic('
L'
btnRegister=newJButton("
注册(R)"
btnRegister.setToolTipText("
注册新用户"
btnRegister.setMnemonic('
R'
btnExit=newJButton("
退出(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("
publicvoidlogin(){
Customerdata=newCustomer();
data.custName=txtUserName.getText();
data.custPassword=pwdPassword.getText();
SockettoServer;
toServer=newSocket(strServerIp,1001);
ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer
.getOutputStream());
streamToServer.writeObject((Customer)data);
BufferedReaderfromServer=newBufferedReader(
newInputStre