面向java的聊天室课程设计.docx
- 文档编号:29179400
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:27
- 大小:392.22KB
面向java的聊天室课程设计.docx
《面向java的聊天室课程设计.docx》由会员分享,可在线阅读,更多相关《面向java的聊天室课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
面向java的聊天室课程设计
目录
摘要II
关键词III
一需求分析III
1.1开发背景III
1.2功能要求III
1.3主要涉及的编程知识III
1.4编程语言及环境IV
二总体设计IV
2.1系统实现的基本原理IV
2.2系统功能V
2.2.1服务器端的主要功能V
2.2.2客户端的主要功能V
2.3系统运行数据流程图VI
2.4功能VII
2.4.1服务器功能流程图VII
2.4.2客户端功能模块流程图VIII
三详细设计X
3.1系统体系协议设计X
3.2聊天室服务器端设计XI
3.2.1ChatServer类XI
3.2.2ClientProc类XII
3.3聊天室客户端设计XV
3.3.1ChatFrame类XV
3.3.2Connect类XVII
3.3.3Plist类XVIII
3.3.4PopupListener类XVIII
3.3.5Acceptfilethread&Sendfilethread类XVIII
四系统实现与调试分析XIX
4.1聊天室服务器运行效果XIX
4.2聊天室客户端用例运行效果XX
4.3结果分析与问题解决XXIII
五总结XXIV
参考文献XXV
摘要
随着 网络时代的到来,网络这个概念将不在陌生。
网络聊天室是在一个网站中,供许多人通过文字与符号进行实时(您输入的内容马上就能被别人看见)交谈、聊天的场所,它是一个向整个因特网开放的地方。
为了加深理解和应用网络编程,实现网络聊天的功能,本次课程设计采用WindowsSocket编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。
本聊天室程序设计基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。
而聊天系统是一个开放的基于Java的应用开发设计,其主要特点是动态的,实时的来完成信息的传递,并拥有大量的客户请求的高效互动,更有效地处理。
本文围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对程序进行如下探讨:
1.需求分析2.总体设计3.详细设计
最后使用Java编程实现的全过程。
在编程我们使用的java语言,是目前比较流行的编程语言。
Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。
本次课程设计的详细分工如下:
20095544张驹强,完成本次实验服务器设计与聊天室信息传输控制协议的设计等过程,并参与文档与测试工作,占总工作量的33.3%;
20095545张源,完成本次系统功能流程设计与文件收发功能的设计等过程,并参与文档与测试工作,占总工作量的33.3%;
20095547朱俊逸,完成本次实验聊天室数据结构设计等过程,并参与文档与测试工作,占总工作量的33.3%。
关键词:
聊天室,JAVA,WindowsSocket
一需求分析
1.1开发背景
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、网络聊天一类的聊天系统的发展日新月异。
因此,我门设计了该网络聊天工具的,而且通过制作该程序还能更好的学习网络软件编程知识。
本系统所要实现的主要功能是为广大用户提供一个借助网络进行人际交往的平台。
因为服务器端采用多线程,所以性能有很大提升。
因为服务端和客户端之间采用TCP协议进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。
1.2功能要求
(1)服务器功能,用于监听与发送广播信息;
(2)客户登录功能;
(3)客户可以一对一和多对多聊天功能;
(4)客户端程序可以实时显示其它在线的用户;
(5)客户之间可以点对点传输文件。
1.3主要涉及的编程知识
基于TCP的Socket通信编程、GUI程序设计、事件处理、多线程技术、输入输出处理、异常处理等。
1.4编程语言及环境
在编程中我们使用的是目前比较流行的编程语言------java语言。
开发环境选择了IBM公司研发的EclipseSDK3.7.0版本。
二总体设计
为实现网络聊天的功能,本次课程设计采用WinsockAPI编程,服务器与客户端采用了TCP/IP连接方式,同时,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听与转发客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。
2.1系统实现的基本原理
本系统在MicrosoftWindows下通过TCP协议建立网络应用程序,需要使用Socket套接口编程技术。
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作该实例,完成所需的会话。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
服务器监听,客户端请求,连接确认。
服务器监听:
是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:
是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:
是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
2.2系统功能
2.2.1服务器端的主要功能
1.启动后进行监听,等待客户端连接;
2.显示系统各种工作的信息,如用户上线和用户信息交流等信息;
3.显示在线用户信息;
4.向已经连接到服务端的用户发送广播消息和系统信息;
5.退出时,断开所有的用户连接。
2.2.2客户端的主要功能
1.登录功能,连接到已经开启的服务器并可以随时登录和注销;
2.用户可以配置要连接服务器端的IP地址和端口号;
3.用户可以设置自己的用户名与性别;
4.用户可以向所有人或者个人发送群消息或私聊消息;
5.用户可以点对点发送和接受文件。
2.3系统运行数据流程图
图2-1
2.4功能
2.4.1服务器功能流程图
图2-2
2.4.2客户端功能模块流程图
图2-3
三详细设计
功能
传输方向
控制信息
用户登录
用户服务器
name&sex
反馈重名信息
服务器用户
samename
反馈不重名信息
服务器用户
nosamename
用户注销
用户
服务器
quit
用户登录提示
服务器
ALL
new&name&sex
刷新下拉菜单列表
服务器
ALL
resetselect&name&name2
刷新在线用户列表
服务器
ALL
resetplist&name.[sex]&...
3.1系统体系协议设计
取消发送文件
源服务器
cancelsendfile+&+目标name
服务器目标
cancelsendfile+&+源name
发送文件
源服务器
sendfile&目标name&路径+源IP+&+源端口+大小
服务器目标
sendfile&源name+&路径&源IP&端口+&大小
接受文件
目标服务器
acceptfile&源目标
服务器源
acceptfile&目标
拒绝接受文件
目标
服务器
refusefile+&+源name
服务器源
refusefile+&+目标name
群聊
源服务器
内容
服务器ALL
源name+:
+内容
公开私聊
源服务器
”whitwho”+&+privateFalse+&+目标name+&+内容
服务器ALL
“whitwho”+&+源name+&+目标name+&+内容
私聊
源服务器
“whitwho”+&+privateTrue+&+目标name+&+内容
服务器目标
“privateTalk”+&+源name+&+目标name+&+内容
3.2聊天室服务器端设计
服务器包server主要包含两个类,分为ChatServer和ClientProc
3.2.1ChatServer类
该类包含了服务器的主要功能的实现:
建立服务器连接,实现服务端用户登录、
退出与监听,实现服务器端的消息收发,在线用户列表实现等主要功能。
它的主要结构如下所示:
图3-1
3.2.2ClientProc类
该类的功能是为某个用户服务的建立一个用户线程。
主要的实现代码如下:
privatevoidupdateList(Stringname,Stringsex){
System.out.println("intwoupdatelist");
ss.cl.remove(name);
ss.resetcl();
Ss.resetplist();
}
publicvoidrun(){
while(name==null){
try{
Stringinmsg;
inmsg=in.readLine();
System.out.println(inmsg);
String[]userInfo;
userInfo=inmsg.split("&");
name=userInfo[0];
sex=userInfo[1];
ss.addConnection(s,this);
if(ss.cl.contains(userInfo[0])){//判断是否重名
System.out.println("有重名错误");
ss.sendERRO(name,"samename");
ss.deleteConnection(s,this,1);
s.close();
return;
}else{
ss.sendOne(name,"nosamename");
System.out.println("没有重名错误!
!
!
!
!
!
!
!
!
");
System.out.println("已将此用户记录");
ss.sendAll("new&"+inmsg);//发送信息更新用户列表new&name&sex
System.out.println("已向所有用户发送"+name);
ss.cl.add(name);
System.out.println("用户列表:
"+ss.cl);
ss.resetcl();
ss.resetplist();
Datet=newDate();
ss.jTextArea1.append(t.toString()+":
"
+s.getInetAddress()+""+s.getPort()+""
+name+"登入"+"\n");
ss.flashlist();
System.out.println("flashlisthasrun");
}
}catch(IOExceptionee){
ee.printStackTrace();
}
}
while(true){
System.out.println("该用户线程开始监听信息");
try{
Stringline=in.readLine();
System.out.println(line);
if(line.equals("quit"))//处理退出事件(读取信息)
{
ss.sendAll("【系统消息】"+this.name+"退出了聊天室");
ss.deleteConnection(s,this);
this.updateList(this.name,this.sex);
s.close();
return;
}else//一般消息,又可以分为几种,对大家说,与某个人交谈,传输文件信息或者私聊
{
String[]inmsg=line.split("&");
if(inmsg[0].compareTo("cancelsendfile")==0){//取消文件发送消息
ss.sendOne(inmsg[1],"cancelsendfile"+"&"+this.name);
}elseif(inmsg[0].compareTo("sendfile")==0)//发送文件消息
{
ss.sendOne(inmsg[1],"sendfile"+"&"+this.name+"&"
+inmsg[2]+"&"+inmsg[3]+"&"+inmsg[4]
+"&"+inmsg[5]);
}elseif(inmsg[0].compareTo("acceptfile")==0)//接收文件消息
{
ss.sendOne(inmsg[1],inmsg[0]+"&"+this.name);
}elseif(inmsg[0].compareTo("refusefile")==0)//拒绝接收文件消息
{
ss.sendOne(inmsg[1],inmsg[0]+"&"+this.name);
}elseif(!
line.startsWith("withWho")){//对所有人说
ss.sendAll(this.name+":
"+line);
}
elseif(inmsg[1].equals("privateTure")){
if(!
(ss.sendOne(inmsg[2],"privateTalk"+"&"+name
+"&"+inmsg[2]+"&"+inmsg[3]))){//私聊不成功发送成功
out.println(inmsg[2]+"已经离开聊天室");
out.flush();
}
}else{//发给所有的人
ss.sendAll("withWho"+"&"+name+"&"+inmsg[2]
+"&"+inmsg[3]);
}
}
}catch(IOExceptione){
System.out.println(e.toString());
try{
s.close();
}catch(IOExceptione2){
}
return;
}
}
}
3.3聊天室客户端设计
聊天室包chat主要包含五个类,分为ChatFrame、Connect、Plist、PopupListener和Acceptfilethread&Sendfilethread。
3.3.1ChatFrame类
该类是聊天室主要功能类,其中包括了聊天室界面设计,群聊私聊等功能的实现。
其中数据包分析功能的主要代码如下:
try{
if((inmsg=in.readLine())!
=null){
if(inmsg.startsWith("samename")){
}elseif(inmsg.startsWith("somequit")){
String[]userInfo=inmsg.split("&");
plist.listModel.removeElement(userInfo[1]+"〖"
+userInfo[2]+"〗");
}elseif(inmsg.startsWith("new"))//接收服务器发送的更新用户列表信息
{
System.out.println(inmsg+"new");
String[]userInfo=inmsg.split("&");
if(userInfo[1].equals(myName))
insert(commonArea,"您"+"上线了");
else
insert(commonArea,userInfo[1]+"上线了");
}elseif(inmsg.startsWith("resetselect")){
System.out.println(inmsg+"new");
String[]userInfo=inmsg.split("&");
perponsComboBox.removeAllItems();
perponsComboBox.addItem("所有人");
for(inti=1;i if(! (myName.equals(userInfo[i]))){ perponsComboBox.addItem(userInfo[i]); } } }elseif(inmsg.startsWith("resetplist")){ System.out.println(inmsg+"new"); String[]userInfo=inmsg.split("&"); String[]cname; plist.listModel.removeAllElements(); for(inti=1;i System.out.println(userInfo[i]+""+myName); cname=userInfo[i].split("〖"); if(! (cname[0].equals(myName))){ plist.listModel.addElement(userInfo[i]); } } }elseif(inmsg! =null)//一般消息 { String[]sendfile=inmsg.split("&"); if(sendfile[0].compareTo("cancelsendfile")==0){ insert(myMsgArea,sendfile[1]+"取消了文件发送"); acceptboolean=false; this.acceptfile.setEnabled(true); this.acceptfileArea.setText(""); }elseif(sendfile[0].compareTo("sendfile")==0){ this.acceptfileArea.setText(sendfile[2]); insert(myMsgArea,sendfile[1]+"发来文件"); filemsg=inmsg; }elseif(sendfile[0].compareTo("acceptfile")==0){ insert(myMsgArea,sendfile[1]+"接收了你发的文件"); }elseif(sendfile[0].compareTo("refusefile")==0){ insert(myMsgArea,sendfile[1]+"拒绝了你发的文件"); sendboolean=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 java 聊天室 课程设计