简易聊天应用程序的设计与实现.docx
《简易聊天应用程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《简易聊天应用程序的设计与实现.docx(17页珍藏版)》请在冰豆网上搜索。
简易聊天应用程序的设计与实现
Java网络程序设计大作业分组报名表
项目名称
简易聊天应用程序的设计与实现
项目功能
网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。
运用java程序编写聊天室,实现简单的聊天功能。
它是图形界面,线程,流与文件系统等技术的综合应用。
程序实现了聊天室的基本功能,其中有:
1.启动服务器。
2.启动登陆界面。
3.进入客户端界面。
4•发送信息。
5•离开客户端界面。
6.关闭服务器。
团队成员
性别
年级
院、系、专业
学号
备注
计算机科学与技术
计算机科学与技术
计算机科学与技术
计算机科学与技术
指导教师
研究方向
软件设计
职称
团队联系方式
联系人
联系
地;
邮编
一、团队介绍及人员分工1
1.1团队介绍1
1.2人员分工1
二、作品概述1
2.1创作背景1
2.2功能概要1
2.3相关技术2
2.4作品可行性分析3
三、需求分析3
3.1功能性需求3
3.2非功能性需求6
四、作品实现6
4.1服务端界面实现6
4.2客户端界面实现8
4.3登录实现10
4.4聊天功能实现11
4.5退出功能实现13
五、作品设计、实现难点分析15
5.1难点分析15
5.2解决方案15
5.3测试结果16
一、团队介绍及人员分工
1.1团队介绍
吴益帆:
有良好的统筹能力和领导力,能合理安排各组员工作。
咪:
踏实耐心,有良好的创新能力和策划能力。
丹丹:
勤奋刻苦、有钻研精神,对待编程工作热情细心,孜孜不倦。
吴晓晓:
对待工作细致专注,设计能力较强。
团队成员之间有较好的默契度及协作性。
分工明确,各司其职,在共同的努力及相互的配合下,共同解决程序中出现的困难并尽可能的优化程序,最终完成整个项目。
1.2人员分工
吴益帆:
负责程序最后的整理,完成部分功能及错误的处理。
咪:
负责程序的编码部分及项目具体功能的实现。
丹丹:
负责程序的界面部分,为改程序搜索解决的方案。
吴晓晓:
负责程序的策划部分,项目的可行性分析及文档的编写工作。
二、作品概述
2.1创作背景
网络聊天室通常直称聊天室,是一种人们可以在线交谈的网络论坛,在同一聊天室的人们通过广播消息进行实时交谈。
在当今信息时代,越来越多的聊天工具被应用,java语言是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。
使用java语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。
面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。
2.2功能概要
运用java程序编写聊天室,实现简单的聊天功能。
它是图形界面,线程,流与文件系统等技术的综合应用。
其界面主要采用了java,awt包,java,swing包等。
程序实现了聊天室的基本功能,其中有:
(1)服务器端功能描述:
启动服务器端:
点击“开启”按钮,启动服务;端口服务:
输入服务器的某个端口号,开启服务器的这个端口;显示在线用户信息:
在右边的用户列表显示所有在线的用户信息;显示用户聊天信息:
在左边的聊天信息区域显示所有用户所发的信息;服务端关闭:
点击“关闭'按钮,关闭服务。
(2)客户端功能描述:
启动客户端:
运行客户端程序,启动客户端;
选择服务器端口号:
输入想要连接的服务器的端口号;用户登录:
填入用户名,点击“登录”按钮,连接相应服务器;显示在线用户:
在右边的用户列表中可以看到当前在线的用户;发送/接受聊天消息:
在下面的文本输入区域输入要发送的容,点击发送可以在左边的聊天信息区域显示自己以及其他用户所发的信息;用户离线:
点击“离线”按钮,与服务器断开连接;客户端关闭:
关闭客户端图形用户界面,关闭客户端。
2・3相关技术
(1)Java概述
JAVA语言有下面一些特点:
简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。
丰富的类库JAVA提供了大量的类以满足网络化、多线程、面向对象系统的需要。
语言包提供的支持包括字符串处理、多线程处理、数学函数处理等,可以用它简单地实现JAVA程序的运行平台。
实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。
输入输出包用统一的”流"模型来实现所有格式的I/O,包括文件系统、网络、输入低级网络包用于实现Socket编程。
抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得JAVA可以移植到不同平台的机器。
网络包支持Internet的TCP/IP协议,提供了与Internet的接口。
它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。
(2)套接字
Socket,简称套接字,用于实现网络上客户和服务器之间的连接。
也就是说网络上两个或两个以上双工方式通信的进程之问总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。
具体的说:
一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读Socket中的信息,类似的服务黠也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。
服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信。
Socket程序的工作过程:
1.建立Socket连接:
在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接道。
2.数据通信:
利用虚拟连接通道传送数据信息进行通信。
3.关闭:
通信结束时,再将所建的虚拟连接拆除。
2.4作品可行性分析
由于本软件知识一个聊天程序,程序只提供用户之间的聊天功能,故对网络传输数据要求不是很高,只要正常的传输速度就可以了。
三、需求分析
3.1功能性需求
本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接字Socket(TCP)连接。
在java中使用套接字相当简单,JavaAPI为处理套接口的通信提供了一个类java.net.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认IP地址为:
localhost默认端口为8888o
(1)聊天室服务端模块,包括端口服务、启动服务、关闭服务、显示在线用户、显示用户聊天信息,如图3.1所示;
图3.1聊天室服务端模块图
端口服务:
输入要侦听的端口,默认为8888;
启动服务:
启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;
关闭服务:
关闭服务器,侦听结束。
客户端用户不能再聊天;
显示在线用户:
服务器列表显示在线用户数和所有在线用户名称;
显示用户聊天信息:
在文本区中显示所有用户聊天信息和登录、退出信息。
(2)聊天室客户端模块,包括用户登录、用户离线、连接设置、发送和接收聊
天信息.显示在线用户、退出,如图3.2所示:
图3.2聊天室客户堤模块图
用户登录:
只能在聊天室服务端已开启的情况下,用户点击''按钮”才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;
用户离线:
用户点击"离线”按钮,退出聊天,与服务器断开连接;
连接设置:
用户可以设置自己连接的服务器的IP地址和端口号,默认的连接地址为:
localhost:
8888;
发送和接收聊天信息:
用户可以给所有人发送信息,并能看到其他用户发送给所有人的消息;
显示在线用户:
服务器列表显示在线用户数和所有在线用户名称;退出:
关闭所有聊天并退出客户端。
(3)程序流程:
首先启动服务器,用户打开客户端,输入服务器端口号,再输入用户名就可以登录,登录以后会显示当前在线的用户信息,用户可以看到其他用户所发的信息,自己也可以发送信息。
用户点击离线就会与服务器断开连接,最后关闭服务器,如图3.3所示:
图3.3程序流程图
3.2非功能性需求
(1)安全需求
本程序能防卫禁止未登录用户进行通信,防止数据丢失,需要输入用户名、端口号连接相应的服务器才允许用户间的通信。
(2)性能需求
本程序使用的对象是所有运行该程序的用户,用户在连接服务器可以进行客户端之间的通信。
(3)易用性需求
本程序的使用对象计算机水平一般,有一定的易用性上的要求,程序应当存在着一些友好性的提示,提高程序的友好度。
(4)可维护性需求
本程序能够及时发现并纠正系统故障,对系统数据进行备份,有系统还原功能。
(5)健壮性需求
本程序在遭遇非法输入数据,能够排除该数据并继续运行;对于系统异常有完备的预警预防处理机制。
四、作品实现
4.1服务端界面实现
在服务端启动后,要显示“简易聊天室服务器”的图形用户界面,如图6.1所示:
图6.1服务端图形用户界面
"简易聊天室服务器”的图形用户界面实现的主要代码如下:
privateLabelsvrIP=newLabel(*服务器IP:
*);privateTextFieldshowSvrIP=newTextFieldO;privateLabelsvrPort=newLabel(**服务器端口:
”);privateTextFieldgetSvrPort=newTextField("8888”);privateButtonenter=newButton(**启动”);
privateTextAreaoutput=newTextAreaO;privateLabeluser=newLabel(n当前在线用户(0)”);privateListlist=newList();
privatevoidsetup(){
Paneltop=newPanel();top.setLayout(newFlowLayout());top.add(svrlP);svrIP.setBackground(bg);top.add(showSvrIP);showSvrIP.setBackground(bg);top.add(svrPort);svrPort・setBackground(bg);top.add(getSvrPort);getSvrPort・setBackground(bg);top.add(enter);enter・setBackground(bg);
Paneleast=newPanel():
east・setLayout(newBorderLayout());east.add("North”.user);user・setBackground(bg);east・add(*Center\list);list・setBackground(bg);
setLayout(newBorderLayout());add("North"■top);
top.setBackground(bg);add(nEasteast);east・setBackground(bg);addC'Center".output):
output.setBackground(bg);setBackground(bg);
点击“启动”按钮,开启默认的服务器8888端口,如图6.2所示:
图6.2服务端端口开启
8888端口开启实现代码如下:
server=newServerSocket(Integer・皿/牝加(getSvrPort
・getText()));rightNow=Calendar,getInstance^・getTime()
.loLocalaString();
output.append(rightNow+"\n开启服务器.\n\nw);entej.setLabelC关闭*);
ht=newHashtable();ht_s=newHashtable();st=newServerThread();serving=true;
}catch(lOExceptionioe){
output・append("Error:
“+ioe+*\n\nH):
}
4.2客户端界面实现
在客户端启动后,显示“简易聊天室客户端”的图形用户界面,如图6.3所
示:
“简易聊天室客户端”的图形用户界面实现的主要代码如下:
privateButtonB_1ogin=newButton陆");privateButtonB_logout=newButton(H离线");privateButtonB_send=newButton(n发送"*);privateLabeluserName=newLabelC您的用户名:
");privateTextFieldgetUserName=newTextFieldO;//惹取用户名privateLabelsvrIP=newLabel(*当前服务器IP:
');
privateTextFieldgetSvrlP=newTextFieldO;//英取服务器IP地址privateLabelsvrPort=newLabel(**当前服务器端口:
*);
privateTextFieldgetSvrPort=newTextFieldO;!
/茨鬆服务器姥口privateTextAreainput=newTextAreaO;//输入文本框privateTextAreaoutput=newTextAreaO:
//检出文亦框privateLabeluser=newLabelC当前在线用户(0)”);
privateListlist=newList();privatevoidsetupO{
Paneltopi=newPanel():
topi.setLayout(newBorderLayout());topi・add("West",userName);userName・setBackground(bg);topi・add(*Center".getUserName);getUserName・setBackground(bg);
Paneltop2=newPanel():
top2.setLayout(newBorderLayout());top2.add("West".svrlP);svrIP.setBackground(bg);top2.add("Center\getSvrIP);getSvrIP.setBackground(bg);
Paneltop3=newPanel():
top3.setLayout(newBorderLayout());top3.add("West”.svrPort);svrPoi't・setBackground(bg);top3・add("CenterM.getSvrPort);getSvrPort・setBackground(bg);
Paneltop4=newPanel():
top4.setLayout(newBorderLayout());top4.add「North",topi);top4.addCCenter'*,top2);top4.add("EastM,top3);
Paneleast=newPanel():
east.setLayout(newBorderLayout());east・add("North*.user);user・setBackground(bg);east.add("Centern.list);list・setBackground(bg);
Panelcenter=newPanel();center・setLayout(newBorderLayout());center・add("CenterM.output);output.setBackground(bg);center・add(*Southn.input);input.setBackground(bg);center・add("East”,east);east.setBackground(bg);
Panelsouth=newPanel();south・setLayout(newFlowLayout());south.add(B_login);
B_login・setBackground(bg);south.add(B_send);
B_send・setBackground(bg);south.add(B_logout);
B_logout・setBackground(bg);
setLayout(newBorderLayout());
add("North*,top4);addCCenter".center);add("South”•south);
setBackground(bg);
4.3登录实现
在客户端输入用户名,点击“登陆”,客户端显示系统时间和“您已成功登陆”(如图6.4所示),并将用户名发送给服务端。
服务端接收来自客户端的数据,显示“sdd登陆”以及将用户名显示在用户列表中(如图6.5所示),并将用户数据发送给所有在线的客户端。
图6.4用户登录
用户登录代码实现如下:
if(login)return;
booleanaccepted=false,refused=false;
Stringline=newStringCH);
try{
connection=newSocket(getSvrIP.getTextO.
Integer・parseInt(getSvi'Port・getText()));in=newDatalnputStream(connection.getlnputStreamO);out=newDataOutputStream(connection.getOutputStream());out.writeUTF(wLw+getUserName.getText()):
while(!
accepted&&!
refused){
line=in.readllTFO;
if(line.char/\t(0)=='R'){refused=true;}if(line.char/\t(0)==*A*){accepted=true:
:
}
if(refused){
rightNow=Calendar,getInstance().getTime().toLoGnloStrin舍();output,append(rightNow+"\n登录失败请使用合法用户名・\n\rT);}if(accepted){
rightNow=Calendar,getInstance().getTime().;
output,append(rightNow+"\n您已成功登陆・\n\rT);
login=true;
图6.5服务端显不用户
服务端向在线用户发送当前在线用户列表代码实现如下:
login=true;
1ist.add(userName);
user・setText("User(”+list・getltemCount()+")");
String】]str=list・RetItems();
1ine="A”;//accepted
for(inti=0;irightNow=Calendar,getInstance()・getTime()・;
output.append(rightNow+*\nn+userName+*登陆.\n\nH):
客户端获取当前在线用户列表代码实现如下:
StringE]str=line.split(n”);for(inti=1;ilist.add(str[i]);
}
user.setText(w当前在线辰户(”+list,getItemCount()+*)*):
4.4聊天功能实现
开启多个客户端,并登录。
在输入框中输入信息,点击“发送”,数据传送至服务端(如图6.6所示),再由服务端数据发送给其他客户端。
每个客户端都接收服务端发送过来的数据,并显示在消息框中,如图6.7所示。
顶脚
图6.6服务端显示消息
用户发送消息代码实现如下:
privatevoidsendMsgO{
if(!
login)
return;
try{
if(input・getText().equals("”)){output,append(n\n发送容不能为空请重新输入\n\n");return;
}
out.writeUTF(nM+input.getText()):
input・setTextC*'*);
}catch(lOExceptionioe){
output・appendC*Error:
*+ioe+*\n\nM);
}
图6.7客户端端显示消息
4.5退出功能实现
当用户点击“离线”,该用户的客户端显示“您已成功离线”,其他用户的客户端显示"\vxx离线”(如图6.8所示);服务端显示“WXX离线”(如图6.9所示)。
图6.8客户端欝线
图6.9服务端显示用户离线
离线实现代码如下:
privatevoidQuitO(
if(!
login)
return;
try{
out.writeUTF(MQM);
user.setText(M当前在线用户(0)*);
}catch(lOExceptionioe){
output・appendCError:
w+ioe+*\n\nK):
}
}
如果用户直接