java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx

上传人:b****1 文档编号:4972072 上传时间:2023-05-04 格式:DOCX 页数:33 大小:136.37KB
下载 相关 举报
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第1页
第1页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第2页
第2页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第3页
第3页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第4页
第4页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第5页
第5页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第6页
第6页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第7页
第7页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第8页
第8页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第9页
第9页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第10页
第10页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第11页
第11页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第12页
第12页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第13页
第13页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第14页
第14页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第15页
第15页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第16页
第16页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第17页
第17页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第18页
第18页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第19页
第19页 / 共33页
java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx_第20页
第20页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx

《java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx(33页珍藏版)》请在冰点文库上搜索。

java实现聊天系统计算机网络课程设计报告材料Word格式文档下载.docx

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的输入输出流做相应的操作

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

1.4系统功能分析

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

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

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

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

本系统实现的功能有:

1.用户名字登录

2.用户之间的群聊

3.用户之间的私聊

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

5.显示在线人数

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

7.能够退出处理

8.用户上下线提醒

2.1模块划分

服务器:

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

客户端:

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

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"

);

ServerHandercn=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周,一点有关课程设计的代码都没写,拿着一本《从零开始学JAVA》把JAVA基础知识,尤其是关于网络编程,线程,图形界面的知识,狠狠地补了一把,终于更看懂一些程序结构清晰,没有反射,泛型等高端用法的程序了。

在这过程中发现,做一个普通的网络聊天室,似乎不要用太多网络知识,懂得Socokt和TCP的使用即可,于是开始慢慢敲代码了。

先把服务器与客户端搭建起来,只能实现连接上的作用,但什么功能都没有,那时,以为能连接上了,那实现一些私聊,群聊的功能应该很简单,但现实确是,只能脑中想象,真的用代码实现,却总是错误百出,做

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

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2