java实现聊天系统计算机网络课程设计报告Word格式.docx
- 文档编号:18286905
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:28
- 大小:107.68KB
java实现聊天系统计算机网络课程设计报告Word格式.docx
《java实现聊天系统计算机网络课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《java实现聊天系统计算机网络课程设计报告Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
2.进一步掌握编程思想与编程技巧,做到模块化程序设计,
3.强化语言学习,尤其是Java的图形界面与多线程,需反复练习,熟练掌握。
1.2系统设计任务
聊天室软件的设计与开发:
基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;
进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。
学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。
1.3系统设计分析
一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket的基础上一层一层增加的。
实现Socket通信的基本方法为以下4个步骤。
(1)在客户端与服务器端创建相应的ServerSockot/Socket实例。
(2)打开连接到Socket的输入输出流
(3)利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作
(4)关闭输入输出流和Socket
我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作
Server
Client
ServerSocket(port)
Socketsocket=
ServerSocket.accept()
接收连接
Socket(host,port)
与服务器建立连接
OutputStreamInputStream
Close
通信过程
二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。
1.4系统功能分析
本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。
采用了多线程技术,可以做到多人同时在线,提高了系统的性能,增强了系统的实用性。
有简单的客户端界面,方便用户使用。
采用的是TCP协议,这是可靠的,稳定的协议,这样不会丢失任何包,也就不会丢失任何信息。
本系统实现的功能有:
1.用户名字登录
2.用户之间的群聊
3.用户之间的私聊
4.动态刷新并显示好友列表
5.显示在线人数
6.服务器可以显示用户在线状态
7.能够退出处理
8.用户上下线提醒
2.1模块划分
服务器:
Server类模块,ServerHanderson模块,sendallclient模块,sendclientlist模块
客户端:
Client类模块,ServiceFrame窗口界面模块
Server模块
ServerHander模块
建立连接
2.2模块结构图
2.3模块功能
服务器:
1.Server类模块:
与客户端建立连接,通过套接字获得名字,在控制端显示提示信息
2.ServerHander模块:
提供线程管理,实现多用户的管理。
针对每一个用户发过来的消息,进行相应处理,再转发给客户。
3.Sendallclient模块:
给每个用户发送消息。
4.Sendclientlist模块:
每当有用户上线,更新每个用户的用户列表。
1.Client类模块:
与服务端建立连接,用户登录,实现消息的群聊,私聊,用户列表的更新等功能。
2.ServiceFrame窗口界面模块:
客户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。
3.1服务器实现
1.Server类模块:
创建ServerSocket,在指定端口监听,当有用户登录,接受套接字输入流,显示其登录信息,调用ServerHander线程进行管理。
publicServer(intport)throwsIOException{
ServerSocketserver=newServerSocket(port);
while(true){
Socketconn=server.accept();
//接收客户端套接字
DataInputStreamin=newDataInputStream(conn.getInputStream());
Stringwho=in.readUTF();
System.out.print("
Client"
+"
(ip:
"
+conn.getInetAddress()+"
)"
+who+"
进入!
\n"
);
ServerHander=newServerHander(who,conn);
cn.start();
}
}
2.Sendallclient模块:
把msg消息发送给每一个用户。
其中allclients是ServerHander的枚举类型,可以指向每一个用户。
protectedstaticvoidsendallclient(Stringmsg){
synchronized(clientlist){
Enumeration<
ServerHander>
allclients=clientlist.elements();
while(allclients.hasMoreElements())
{
ServerHanderserh=(ServerHander)allclients.nextElement();
try{
serh.out.writeUTF(msg);
serh.out.flush();
}
catch(IOExceptionexc){
serh.interrupt();
}
3.Sendclientlist模块:
更新用户列表,当有新用户上线时,对以前的用户的好友列表,加上这个新用户名字,对于这个新用户,加上所有用户的名字。
实现方法是在名字信息后面加上“$”关键字,这样客户端接收到这个关键字时,做相应处理。
publicstaticsynchronizedvoidsendclientlist(){
for(intj=0;
j<
clientlist.size();
j++)
ServerHanderallclients1=clientlist.elementAt(j);
if(j==clientlist.size()-1)//若是新增用户,把vector中的所有用户都发送过去
{
for(inti=0;
i<
i++)
ServerHanderallclients2=clientlist.elementAt(i);
try{
allclients1.out.writeUTF(allclients2.who+"
$"
allclients1.out.flush();
}catch(IOExceptionexc){
allclients1.interrupt();
else{//老用户,只增加新来的用户
ServerHanderallclients3=clientlist.lastElement();
try{
allclients1.out.writeUTF(allclients3.who+"
allclients1.out.flush();
}catch(IOExceptionexc){
allclients1.interrupt();
4.ServerHander模块:
关键模块,与客户端进行消息的交互,相互加关键字,解密关键字,做到上下线提醒,群聊,私聊等功能。
创建ServerHander的Vector对象,可以方便用户管理,Vector对象是可变数组,而且支持线程同步,适合在网络编程中使用。
对用户发送过来的消息通过关键字进行解析,前面的字符串为发送的消息,后面的字符串为发送对象,若发送给所有人,则直接发送,若发送给某个人,则在发送的消息后面再加上关键字,让客户端去解析。
有用户下线,发送下线消息,通过‘下线’关键字,可以在客户端更新用户列表。
classServerHanderextendsThread{
Socketsocket;
DataInputStreamin;
DataOutputStreamout;
Stringwho;
protectedstaticVector<
clientlist=newVector<
();
//把用户线程放入可变对象数组
publicServerHander(Stringname,Socketsocket)throwsIOException{
this.who=name;
this.socket=socket;
in=newDataInputStream(newBufferedInputStream(socket.getInputStream()));
out=newDataOutputStream(newBufferedOutputStream(socket.getOutputStream()));
publicvoidrun(){
try{
clientlist.addElement(this);
//VECTOR中增加新线程
sendallclient(who+"
上线"
sendclientlist();
//为每一个客户端更新在线用户
while(true){
Stringmsg=in.readUTF();
intindex=msg.lastIndexOf("
//对客户端发过来的信息做相应的处理
Stringstr=msg.substring(index+1,msg.length());
//取得发送对象和发送的消息
msg=msg.substring(0,index);
if(str.equals("
所有人"
)==false)
{
sendallclient(who+"
对"
+str+"
说:
"
+msg+"
//不是发给所有人则增添标记
else
sendallclient(who+"
对所有人说:
+msg);
catch(IOExceptione){
System.out.println("
error"
finally{
clientlist.removeElement(this);
+"
+socket.getInetAddress()+"
退出!
下线"
try{
socket.close();
catch(IOExceptionex){
System.out.println("
clsing"
3.2客户端实现
1.ServerFrame窗口界面模块:
有一个消息显示文本区域,消息发送框,发送按钮,好友列表下拉框,一条标签用来显示在线人数,文本区域添加在JscrollPane上,这样,无论消息有多长,多宽,都能显示出来,如果没添加的话,消息一多,就显示不出了,这个小细节,很多人都没注意。
classServiceFrameextendsFrame{
JTextAreashowAT;
JTextFieldsendFD;
JComboBoxfriendlist;
JButtonbut;
JLabelshowCount;
JScrollPanetextAreaScrollPane;
JPaneltextFieldPanel=newJPanel();
publicServiceFrame(Stringwinname){
super(winname);
//继承父类的名字
setSize(500,400);
textFieldPanel.setLayout(newFlowLayout(0,10,10));
showAT=newJTextArea(400,400);
showAT.setEditable(false);
textAreaScrollPane=newJScrollPane(showAT);
add(textAreaScrollPane,BorderLayout.CENTER);
add(textFieldPanel,BorderLayout.SOUTH);
friendlist=newJComboBox();
friendlist.addItem("
textFieldPanel.add(friendlist);
sendFD=newJTextField(20);
textFieldPanel.add(sendFD);
but=newJButton("
发送"
but.setMnemonic(KeyEvent.VK_ENTER);
textFieldPanel.add(but);
showCount=newJLabel("
在线人数:
1"
textFieldPanel.add(showCount);
show();
}
按钮监听事件:
当按下按钮,把发送文本框的消息再加上当前选择的发送对象写入输出流,中间用关键字隔开,在服务端方便解析。
classActListenerimplementsActionListener
{
Clientclient;
ServiceFramesframe;
publicActListener(Clientc,ServiceFramesf){
client=c;
sframe=sf;
publicvoidactionPerformed(ActionEvente){//发送信息,并以作为私聊标记
client.send(sframe.sendFD.getText().trim()+"
+sframe.friendlist.getSelectedItem());
sframe.sendFD.setText("
退出事件:
添加退出功能,不然直接点叉叉退出,会报错。
classExitListenerextendsWindowAdapter{
publicExitListener(Clientc){
client=c;
publicvoidwindowClosing(WindowEvente){
client.close();
System.exit(0);
2.Client类模块:
关键模块,通过服务器IP地址与端口建立连接,在控制台输入名字,发送给服务器,服务器会进行上线提醒与更新用户列表的操作。
publicclassClient{
publicServiceFramesf;
privateSocketcsocket;
privateDataInputStreamin;
privateDataOutputStreamout;
publicstaticvoidmain(String[]args){
BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));
System.out.println("
请输入一个名字:
Stringwho="
;
who=in.readLine().trim();
//控制台获得名字
catch(IOExceptione){
e.printStackTrace();
newClient(who,"
127.0.0.1"
9992);
在Client的构造函数中实现对服务器消息的解析,接受消息str1
1.若str1以$结尾,说明是有用户上线,在所有用户消息区域显示该消息,并且更新每一个用户的好友列表。
2.若str1以结尾,说明这是一条私聊消息,解析其中的名字信息,若该用户的名字在里面,才显示该消息。
3.若str1以‘下线’结尾,说明有用户下线,在所有用户消息区域显示该消息,并在所有用户的用户列表中删除该用户的信息
最后,显示当前在线人数。
publicClient(Stringwho,Stringserver,intport){
sf=newServiceFrame(who+"
的客户端"
Stringstr1=null;
sf.but.addActionListener(newActListener(this,sf));
sf.addWindowListener(newExitListener(this));
csocket=newSocket(server,port);
in=newDataInputStream(newBufferedInputStream(csocket.getInputStream()));
out=newDataOutputStream(newBufferedOutputStream(csocket.getOutputStream()));
out.writeUTF(who);
out.flush();
//名字发给服务器
while(true){
str1=in.readUTF();
//重点!
!
,服务器端发来的消息
if(str1.endsWith("
))//若以$结尾,则增添用户
{
intindex=str1.lastIndexOf("
Stringstr2=str1.substring(0,index);
sf.friendlist.addItem(str2.trim());
elseif(str1.endsWith("
))//以结尾为私聊信息
{
str1=str1.substring(0,str1.length()-1);
if(str1.contains(who))
sf.showAT.append("
--"
+str1+"
}
else{
if(str1.endsWith("
下线"
))//用户下线,删除此用户
sf.friendlist.removeItem(str2.trim());
sf.showAT.append("
sf.showCount.setText("
+(sf.friendlist.getItemCount()-1));
//动态更新在线人数
catch(Exceptione){
ServerError"
this.close();
System.exit(0);
1.服务器控制台显示并记录登录,退出信息。
2.在客户端控制台输入名字进入聊天室。
3.聊天界面显示客户端名字,好友列表,在线人数等信息。
4.私聊,群聊显示,若选择所有人则为群聊,选择某一个人,则为私聊。
如下图,群聊消息,在所有客户端都显示,私聊信息只会在发送者与接受者中显示。
5.人数动态刷新。
从收到题目的茫然无措,不知从何下手,到最后交出的成果,真的让我学到了很多,可能比一学期的JAVA和网络课程设计中学到的关于TCP协议的知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。
说说完成课程设计的整个过程吧。
刚看到可以选择的六个题目时,犹如晴天霹雳,别说用代码实现了,连题目要求都不理解,上课恍惚听老师提到过这个知识点,可是重要的内容却一点也不知道,而且,由于要做图形界面,所以用JAVA会更简单点,但JAVA也忘得差不多了,所以只能从头来过,刚开始的3周,一点有关课程设计的代码都没写,拿着一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实现 聊天 系统 计算机网络 课程设计 报告