收藏 分销(赏)

java实现聊天系统计算机网络专业课程设计方案报告.doc

上传人:快乐****生活 文档编号:2511353 上传时间:2024-05-31 格式:DOC 页数:35 大小:188.54KB
下载 相关 举报
java实现聊天系统计算机网络专业课程设计方案报告.doc_第1页
第1页 / 共35页
java实现聊天系统计算机网络专业课程设计方案报告.doc_第2页
第2页 / 共35页
java实现聊天系统计算机网络专业课程设计方案报告.doc_第3页
第3页 / 共35页
java实现聊天系统计算机网络专业课程设计方案报告.doc_第4页
第4页 / 共35页
java实现聊天系统计算机网络专业课程设计方案报告.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、 计算机网络课程设计汇报 学生姓名 学 号 班 级 指导老师 设计时间 目录第一章 系统描述1.1设计目标31.2系统设计任务 31.3系统设计分析31.4系统功效分析4第二章 功效模块结构2.1模块划分52.2模块结构图52.1模块功效5第三章 模块算法实现3.1 服务器实现63.2 用户端实现9第四章 运行结果13第五章 课程设计总结17第六章 附录6.1 参考文件196.2 源代码19第一章 系统描述1.1设计目标1学习网络编程知识,掌握网络编程方法。2深入掌握编程思想和编程技巧,做到模块化程序设计,3. 强化语言学习,尤其是Java图形界面和多线程,需反复练习,熟练掌握。1.2系统设计

2、任务聊天室软件设计和开发:基础要求能够完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;深入要求带表情,附件发送,聊天信息加密传送,设置黑名单等。学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端多个TCP连接建立。1.3系统设计分析一实现网络聊天室编程,关键在于Socket通信,程序功效全部是在Socket基础上一层一层增加。实现Socket通信基础方法为以下4个步骤。(1) 在用户端和服务器端创建对应ServerSockot/Socket实例。(2) 打开连接到Socket输入输出流(3) 利用输入输出流,根据一定协议(TCP协议)对S

3、ocket进行读写操作(4) 关闭输入输出流和Socket我们要实现功效全部是在第3步对Socket输入输出流做对应操作ServerSocket(port)Socket socket= ServerSocket.accept() 接收连接CloseOutputStream InputStreamServer通信过程Socket(host,port)和服务器建立连接CloseOutputStream InputStreamClient二 因为是多用户端,所以必需用线程进行控制,不一样处理线程为不一样用户服务,根本程只负责循环等候,处理线程负责网络连接,接收用户输入信息,再做对应处理。1.4系统功

4、效分析本系统能够经过网络进行聊天,采取用户端服务器模式,所以程序介绍清楚易懂,而且用户全部是在用户端进行活动,方便对用户管理,也使得程序运行和差错简单起来。采取了多线程技术,能够做到多人同时在线,提升了系统性能,增强了系统实用性。有简单用户端界面,方便用户使用。采取是TCP协议,这是可靠,稳定协议,这么不会丢失任何包,也就不会丢失任何信息。本系统实现功效有:1. 用户名字登录2. 用户之间群聊3. 用户之间私聊4. 动态刷新并显示好友列表5. 显示在线人数6. 服务器能够显示用户在线状态7. 能够退出处理8. 用户上下线提醒第二章 功效模块结构2.1 模块划分 服务器: Server类模块,S

5、erverHanderson模块,sendallclient模块,sendclientlist模块用户端:Client类模块, ServiceFrame窗口界面模块ServerHander模块2.2 模块结构图ServerHander模块Server模块ServerHander模块通信过程建立连接ServiceFrame模块Client模块2.3 模块功效服务器:1. Server类模块:和用户端建立连接,经过套接字取得名字,在控制端显示提醒信息2. ServerHander模块:提供线程管理,实现多用户管理。针对每一个用户发过来消息,进行对应处理,再转发给用户。3. Sendallclien

6、t模块:给每个用户发送消息。4. Sendclientlist模块:每当有用户上线,更新每个用户用户列表。用户端:1. Client类模块:和服务端建立连接,用户登录,实现消息群聊,私聊,用户列表更新等功效。2. ServiceFrame窗口界面模块:用户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。第三章 模块算法实现3.1 服务器实现 1. Server类模块:创建ServerSocket,在指定端口监听,当有用户登录,接收套接字输入流,显示其登录信息,调用ServerHander线程进行管理。public Server(int port) th

7、rows IOExceptionServerSocket server=new ServerSocket(port);while(true)Socket conn=server.accept(); /接收用户端套接字DataInputStream in =new DataInputStream(conn.getInputStream();String who=in.readUTF();System.out.print(Client+(ip:+conn.getInetAddress()+)+who+ 进入!+n); ServerHander cn=new ServerHander(who,con

8、n);cn.start();2. Sendallclient模块: 把msg消息发送给每一个用户。其中allclients是ServerHander枚举类型,能够指向每一个用户。protected static void sendallclient(String msg) synchronized (clientlist)Enumeration allclients=clientlist.elements();while(allclients.hasMoreElements()ServerHander serh=(ServerHander)allclients.nextElement();tr

9、yserh.out.writeUTF(msg);serh.out.flush();catch(IOException exc)serh.interrupt();3.Sendclientlist模块:更新用户列表,当有新用户上线时,对以前用户好友列表,加上这个新用户名字,对于这个新用户,加上全部用户名字。实现方法是在名字信息后面加上“$”关键字,这么用户端接收到这个关键字时,做对应处理。public static synchronized void sendclientlist()for(int j=0;jclientlist.size();j+)ServerHander allclients1

10、=clientlist.elementAt(j); if(j=clientlist.size()-1) /若是新增用户,把vector中全部用户全部发送过去 for(int i = 0;iclientlist.size();i+) ServerHander allclients2=clientlist.elementAt(i); try allclients1.out.writeUTF(allclients2.who+$); allclients1.out.flush(); catch(IOException exc) allclients1.interrupt(); else /老用户,只增

11、加新来用户 ServerHander allclients3=clientlist.lastElement(); try allclients1.out.writeUTF(allclients3.who+$); allclients1.out.flush(); catch(IOException exc) allclients1.interrupt(); 4.ServerHander模块: 关键模块,和用户端进行消息交互,相互加关键字,解密关键字,做到上下线提醒,群聊,私聊等功效。创建ServerHanderVector对象,能够方便用户管理,Vector对象是可变数组,而且支持线程同时,适合

12、在网络编程中使用。对用户发送过来消息经过关键字进行解析,前面字符串为发送消息,后面字符串为发送对象,若发送给全部些人,则直接发送,若发送给某个人,则在发送消息后面再加上关键字,让用户端去解析。有用户下线,发送下线消息,经过下线关键字,能够在用户端更新用户列表。class ServerHander extends ThreadSocket socket;DataInputStream in;DataOutputStream out;String who;protected static Vectorclientlist=new Vector() ; /把用户线程放入可变对象数组public Se

13、rverHander(String name,Socket socket) throws IOExceptionthis.who = name;this.socket = socket;in =new DataInputStream(new BufferedInputStream(socket.getInputStream();out =new DataOutputStream(new BufferedOutputStream(socket.getOutputStream();public void run()try clientlist.addElement(this); /VECTOR中增

14、加新线程 sendallclient(who+ 上线); sendclientlist(); /为每一个用户端更新在线用户 while(true) String msg=in.readUTF(); int index = msg.lastIndexOf(); /对用户端发过来信息做对应处理 String str = msg.substring(index+1,msg.length(); /取得发送对象和发送消息 msg=msg.substring(0,index); if(str.equals(全部些人)=false) sendallclient(who+ 对+str+ 说: +msg+);

15、/不是发给全部些人则增添标识 else sendallclient(who+ 对全部些人 说: +msg); catch(IOException e)System.out.println(error);finallyclientlist.removeElement(this);System.out.print(Client +(ip:+socket.getInetAddress()+)+who+ 退出!+n);sendallclient(who+ 下线);trysocket.close();catch(IOException ex)System.out.println(clsing);3.2

16、用户端实现 1.ServerFrame窗口界面模块:有一个消息显示文本区域,消息发送框,发送按钮,好友列表下拉框,一条标签用来显示在线人数,文本区域添加在JscrollPane上,这么,不管消息有多长,多宽,全部能显示出来,假如没添加话,消息一多,就显示不出了,这个小细节,大家全部没注意。class ServiceFrame extends Frame JTextArea showAT; JTextField sendFD; JComboBox friendlist; JButton but; JLabel showCount; JScrollPane textAreaScrollPane;

17、JPanel textFieldPanel = new JPanel(); public ServiceFrame (String winname)super(winname); /继承父类名字setSize(500,400);textFieldPanel.setLayout(new FlowLayout(0,10,10);showAT = new JTextArea(400,400);showAT.setEditable(false);textAreaScrollPane = new JScrollPane(showAT);add(textAreaScrollPane, BorderLayo

18、ut.CENTER);add(textFieldPanel, BorderLayout.SOUTH);friendlist = new JComboBox();friendlist.addItem(全部些人);textFieldPanel.add(friendlist);sendFD = new JTextField(20);textFieldPanel.add(sendFD);but = new JButton(发送);but.setMnemonic(KeyEvent.VK_ENTER);textFieldPanel.add(but);showCount = new JLabel(在线人数:

19、1);textFieldPanel.add(showCount); show();按钮监听事件:当按下按钮,把发送文本框消息再加上目前选择发送对象写入输出流,中间用关键字隔开,在服务端方便解析。class ActListener implements ActionListener Client client; ServiceFrame sframe; public ActListener(Client c,ServiceFrame sf) client=c; sframe=sf; public void actionPerformed(ActionEvent e) /发送信息,并以作为私聊标识

20、client.send(sframe.sendFD.getText().trim()+sframe.friendlist.getSelectedItem(); sframe.sendFD.setText( ); 退出事件:添加退出功效,不然直接点叉叉退出,会报错。class ExitListener extends WindowAdapterClient client;public ExitListener(Client c) client=c; public void windowClosing(WindowEvent e)client.close();System.exit(0);2.Cl

21、ient类模块:关键模块,经过服务器IP地址和端口建立连接,在控制台输入名字,发送给服务器,服务器会进行上线提醒和更新用户列表操作。public class Client public ServiceFrame sf; private Socket csocket; private DataInputStream in; private DataOutputStream out; public static void main(String args) BufferedReader in = new BufferedReader(new InputStreamReader(System.in)

22、; System.out.println(请输入一个名字: ); String who= ; try who=in.readLine().trim(); /控制台取得名字 catch(IOException e) e.printStackTrace(); new Client(who,127.0.0.1,9992); 在Client结构函数中实现对服务器消息解析,接收消息str11. 若str1以$结尾,说明是有用户上线,在全部用户消息区域显示该消息,而且更新每一个用户好友列表。2. 若str1以结尾,说明这是一条私聊消息,解析其中名字信息,若该用户名字在里面,才显示该消息。3. 若str1以

23、下线结尾,说明有用户下线,在全部用户消息区域显示该消息,并在全部用户用户列表中删除该用户信息最终,显示目前在线人数。public Client(String who,String server,int port) sf=new ServiceFrame(who+ 用户端); String str1 = null; sf.but.addActionListener(new ActListener(this,sf); sf.addWindowListener(new ExitListener(this); try csocket =new Socket(server,port); in=new D

24、ataInputStream(new BufferedInputStream(csocket.getInputStream(); out=new DataOutputStream(new BufferedOutputStream(csocket.getOutputStream(); out.writeUTF(who); out.flush(); /名字发给服务器 while(true) str1 = in.readUTF(); /关键!,服务器端发来消息 if(str1.endsWith($) /若以$结尾,则增添用户 int index = str1.lastIndexOf($); Stri

25、ng str2 = str1.substring(0,index); sf.friendlist.addItem(str2.trim(); else if(str1.endsWith() /以结尾为私聊信息 str1=str1.substring(0,str1.length()-1); if(str1.contains(who) sf.showAT.append(- +str1+n); else if(str1.endsWith(下线) /用户下线,删除此用户 int index = str1.lastIndexOf(下线); String str2 = str1.substring(0,in

26、dex); sf.friendlist.removeItem(str2.trim(); sf.showAT.append(- +str1+n); sf.showCount.setText(在线人数:+(sf.friendlist.getItemCount()-1); /动态更新在线人数 catch(Exception e) System.out.println(Server Error); this.close(); System.exit(0); 第四章 运行结果1.服务器控制台显示并统计登录,退出信息。2.在用户端控制台输入名字进入聊天室。 3.聊天界面显示用户端名字,好友列表,在线人数等

27、信息。4.私聊,群聊显示,若选择全部些人则为群聊,选择某一个人,则为私聊。以下图,群聊消息,在全部用户端全部显示,私聊信息只会在发送者和接收者中显示。 5.人数动态刷新。 第五章 课程设计总结从收到题目标茫然无措,不知从何下手,到最终交出结果,真让我学到了很多,可能比一学期JAVA和网络课程设计中学到相关TCP协议知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。说说完成课程设计整个过程吧。刚看到能够选择六个题目时,如同晴天霹雳,别说用代码实现了,连题目要求全部不了解,上课恍惚听老师提到过这个知识点,可是关键内容却一点也不知道,而且,因为要做图形界面,所以用JAV

28、A会更简单点,但JAVA也忘得差不多了,所以只能从头来过,刚开始3周,一点相关课程设计代码全部没写,拿着一本从零开始学JAVA把JAVA基础知识,尤其是相关网络编程,线程,图形界面知识,狠狠地补了一把,最终更看懂部分程序结构清楚,没有反射,泛型等高端使用方法程序了。在这过程中发觉,做一个一般网络聊天室,似乎不要用太多网络知识,知道Socokt和TCP使用即可,于是开始慢慢敲代码了。先把服务器和用户端搭建起来,只能实现连接上作用,但什么功效全部没有,那时,认为能连接上了,那实现部分私聊,群聊功效应该很简单,但现实确是,只能脑中想象,真用代码实现,却总是错误百出,做心灰意冷,尤其是私聊功效实现,刚

29、开始,想让服务器直接向接收者和发送者发送消息,但总是不如人意,折腾了大约一星期,才意识到TCP协议就是用自己定义部分规则,在服务器和用户端之间传输消息,能够添加关键字,再解析。于是才处理私聊问题,然后添加好友列表和更新好友功效也在跌跌撞撞中实现了。窗口布局,刚开始想用网格包布局,但用很不熟练,造成布局不理想,无奈,只能用最基础布局了,所以界面看上去很一般。想发送图片,却发觉文本区域根本不能显示图片,能用JEditorPane实现,但有BUG,不知怎样调试,书上,网上也没找到能处理措施,只能放弃了。 课程设计在这种不停学习和探索中差不多完成了,说说这次课程设计不足吧。1. 学过知识不牢靠,所以花

30、费了大量时间用来学习基础知识,那些应该在以前就掌握。2. 程序界面很一般,像老师说一样,是最最古老聊天系统,没有什么花哨。3. 没能实现附加功效,像加密传输,文件传送等功效。其实,挺遗憾,因为以前选修过密码学,应该能够实现简单DES加密。4. 没有用到JDBC,把用户信息存放到数据库表中,实施账号密码登录,提升系统安全性。做了这么多课程设计,最大体会就是用心去做,用心去学,你一定能学到很多知识,而且这是对学过知识应用,所以比单一上课更有意思。对于自己能独立完成课程设计,还是颇为满意,最少努力没有白费,学到知识也很多,最关键应该是了解了TCP协议原理,并学会了简单应用,JAVA编程水平得到了一定

31、提升,面向对象思想比以往更清楚了。第六章 附录6.1参考文件从零开始学JAVA 王发波 中国铁道出版社Java 2实用教程 耿祥文 清华大学出版社6.2源代码服务器代码:package service;import java.io.*;import java.util.*;import .*;public class Server public Server(int port) throws IOExceptionServerSocket server=new ServerSocket(port);while(true)Socket conn=server.accept(); /建立用户端套接

32、字DataInputStream in =new DataInputStream(conn.getInputStream();String who=in.readUTF();System.out.print(Client +(ip:+conn.getInetAddress()+)+who+ 进入!+n);ServerHander cn=new ServerHander(who,conn);cn.start();public static void main(String args)throws IOExceptionnew Server(9992);class ServerHander ext

33、ends ThreadSocket socket;DataInputStream in;DataOutputStream out;String who;protected static Vectorclientlist=new Vector() ; /把用户线程放入可变对象数组public ServerHander(String name,Socket socket) throws IOExceptionthis.who = name;this.socket = socket;in =new DataInputStream(new BufferedInputStream(socket.getI

34、nputStream();out =new DataOutputStream(new BufferedOutputStream(socket.getOutputStream();public void run()try clientlist.addElement(this); /VECTOR中增加新线程 sendallclient(who+ 上线); sendclientlist(); /为每一个用户端更新在线用户 while(true) String msg=in.readUTF(); int index = msg.lastIndexOf(); /对用户端发过来信息做对应处理 String

35、 str = msg.substring(index+1,msg.length(); /取得发送对象和发送消息 msg=msg.substring(0,index); if(str.equals(全部些人)=false) sendallclient(who+ 对+str+ 说: +msg+); /不是发给全部些人则增添标识 else sendallclient(who+ 对全部些人 说: +msg); catch(IOException e)System.out.println(error);finallyclientlist.removeElement(this);System.out.pr

36、int(Client +(ip:+socket.getInetAddress()+)+who+ 退出!+n);sendallclient(who+ 下线);trysocket.close();catch(IOException ex)System.out.println(clsing);/发送消息给全部用户protected static void sendallclient(String msg) synchronized (clientlist)Enumeration allclients=clientlist.elements();while(allclients.hasMoreElements()ServerHander serh=(ServerHander)allclients.nextElement();tryserh.out.writeUTF(msg);serh.out.flush();catch(IOException exc)serh.interrupt();/更新用户列表public static synchroni

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服