java实现聊天系统计算机网络课程设计报告.docx

上传人:b****3 文档编号:5305061 上传时间:2022-12-15 格式:DOCX 页数:28 大小:107.68KB
下载 相关 举报
java实现聊天系统计算机网络课程设计报告.docx_第1页
第1页 / 共28页
java实现聊天系统计算机网络课程设计报告.docx_第2页
第2页 / 共28页
java实现聊天系统计算机网络课程设计报告.docx_第3页
第3页 / 共28页
java实现聊天系统计算机网络课程设计报告.docx_第4页
第4页 / 共28页
java实现聊天系统计算机网络课程设计报告.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

java实现聊天系统计算机网络课程设计报告.docx

《java实现聊天系统计算机网络课程设计报告.docx》由会员分享,可在线阅读,更多相关《java实现聊天系统计算机网络课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。

java实现聊天系统计算机网络课程设计报告.docx

java实现聊天系统计算机网络课程设计报告

 

计算机网络课程设计报告

 

学生姓名

学号

班级

指导教师

设计时间

第一章系统描述

1.1设计目的·························3

1.2系统设计任务·····················3

1.3系统设计分析······················3

1.4系统功能分析······················4

第二章功能模块结构

2.1模块划分·························5

2.2模块结构图·······················5

2.1模块功能·························5

第三章模块算法实现

3.1服务器实现·······················6

3.2客户端实现·······················9

第四章运行结果

·······················13

第五章课程设计总结

·······················17

第六章附录

6.1参考文献························19

6.2源代码··························19

 

第一章系统描述

1.1设计目的

1.学习网络编程的知识,掌握网络编程的方法。

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

OutputStreamInputStream

Close

Close

通信过程

 

二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。

1.4系统功能分析

本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。

采用了多线程技术,可以做到多人同时在线,提高了系统的性能,增强了系统的实用性。

有简单的客户端界面,方便用户使用。

采用的是TCP协议,这是可靠的,稳定的协议,这样不会丢失任何包,也就不会丢失任何信息。

本系统实现的功能有:

1.用户名字登录

2.用户之间的群聊

3.用户之间的私聊

4.动态刷新并显示好友列表

5.显示在线人数

6.服务器可以显示用户在线状态

7.能够退出处理

8.用户上下线提醒

 

第二章功能模块结构

2.1模块划分

服务器:

Server类模块,ServerHanderson模块,sendallclient模块,sendclientlist模块

客户端:

Client类模块,ServiceFrame窗口界面模块

Server模块

ServerHander模块

ServerHander模块

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){

Enumerationallclients=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

{

ServerHanderallclients1=clientlist.elementAt(j);

if(j==clientlist.size()-1)//若是新增用户,把vector中的所有用户都发送过去

{

for(inti=0;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;

protectedstaticVectorclientlist=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);

System.out.print("Client"+"(ip:

"+socket.getInetAddress()+")"+who+"退出!

"+"\n");

sendallclient(who+"下线");

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{

Clientclient;

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="";

try{

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));

try{

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+"\n");

}

else{

if(str1.endsWith("下线"))//用户下线,删除此用户

{

intindex=str1.lastIndexOf("下线");

Stringstr2=str1.substring(0,index);

sf.friendlist.removeItem(str2.trim());

}

sf.showAT.append("--"+str1+"\n");

}

sf.showCount.setText("在线人数:

"+(sf.friendlist.getItemCount()-1));//动态更新在线人数

}

}

catch(Exceptione){

System.out.println("ServerError");

this.close();

System.exit(0);

}

}

第四章运行结果

1.服务器控制台显示并记录登录,退出信息。

 

2.在客户端控制台输入名字进入聊天室。

3.聊天界面显示客户端名字,好友列表,在线人数等信息。

 

4.私聊,群聊显示,若选择所有人则为群聊,选择某一个人,则为私聊。

如下图,群聊消息,在所有客户端都显示,私聊信息只会在发送者与接受者中显示。

 

5.人数动态刷新。

 

第五章课程设计总结

从收到题目的茫然无措,不知从何下手,到最后交出的成果,真的让我学到了很多,可能比一学期的JAVA和网络课程设计中学到的关于TCP协议的知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。

说说完成课程设计的整个过程吧。

刚看到可以选择的六个题目时,犹如晴天霹雳,别说用代码实现了,连题目要求都不理解,上课恍惚听老师提到过这个知识点,可是重要的内容却一点也不知道,而且,由于要做图形界面,所以用JAVA会更简单点,但JAVA也忘得差不多了,所以只能从头来过,刚开始的3周,一点有关课程设计的代码都没写,拿着一

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

当前位置:首页 > 农林牧渔 > 林学

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

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