ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:104.47KB ,
资源ID:29920971      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29920971.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(jv实现聊天系统计算机网络课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、jv实现聊天系统计算机网络课程设计报告 计算机网络课程设计报告 学生姓名 学 号 班 级 指导教师 设计时间 第一章 系统描述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的图形界面与多

2、线程,需反复练习,熟练掌握。1.2系统设计任务聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。1.3系统设计分析一实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket的基础上一层一层增加的。实现Socket通信的基本方法为以下4个步骤。(1) 在客户端与服务器端创建相应的ServerSockot/Socket实例。(2) 打开连接到Socket的输

3、入输出流(3) 利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作(4) 关闭输入输出流和Socket我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作ServerClientServerSocket(port)Socket socket= ServerSocket.accept() 接收连接Socket(host,port)与服务器建立连接OutputStream InputStreamOutputStream InputStreamCloseClose通信过程二 因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待

4、,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。1.4系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。采用了多线程技术,可以做到多人同时在线,提高了系统的性能,增强了系统的实用性。有简单的客户端界面,方便用户使用。采用的是TCP协议,这是可靠的,稳定的协议,这样不会丢失任何包,也就不会丢失任何信息。本系统实现的功能有:1. 用户名字登录2. 用户之间的群聊3. 用户之间的私聊4. 动态刷新并显示好友列表5. 显示在线人数6. 服务器可以显示用户在线状态7. 能够退出处理

5、8. 用户上下线提醒第二章 功能模块结构2.1 模块划分 服务器: Server类模块,ServerHanderson模块,sendallclient模块,sendclientlist模块客户端:Client类模块, ServiceFrame窗口界面模块Server模块Client模块ServerHander模块ServerHander模块ServerHander模块ServiceFrame模块建立连接通信过程2.2 模块结构图2.3 模块功能服务器:1. Server类模块:与客户端建立连接,通过套接字获得名字,在控制端显示提示信息2. ServerHander模块:提供线程管理,实现多用户

6、的管理。针对每一个用户发过来的消息,进行相应处理,再转发给客户。3. Sendallclient模块:给每个用户发送消息。4. Sendclientlist模块:每当有用户上线,更新每个用户的用户列表。客户端:1. Client类模块:与服务端建立连接,用户登录,实现消息的群聊,私聊,用户列表的更新等功能。2. ServiceFrame窗口界面模块:客户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。第三章 模块算法实现3.1 服务器实现 1. Server类模块:创建ServerSocket,在指定端口监听,当有用户登录,接受套接字输入流,显示其登录

7、信息,调用ServerHander线程进行管理。public Server(int port) throws IOException ServerSocket 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()

8、+)+who+ 进入!+n); ServerHander cn=new ServerHander(who,conn); cn.start(); 2. Sendallclient模块: 把msg消息发送给每一个用户。其中allclients是ServerHander的枚举类型,可以指向每一个用户。protected static void sendallclient(String msg) synchronized (clientlist) Enumeration allclients=clientlist.elements(); while(allclients.hasMoreElements

9、() ServerHander serh=(ServerHander)allclients.nextElement(); try serh.out.writeUTF(msg); serh.out.flush(); catch(IOException exc) serh.interrupt(); 3.Sendclientlist模块:更新用户列表,当有新用户上线时,对以前的用户的好友列表,加上这个新用户名字,对于这个新用户,加上所有用户的名字。实现方法是在名字信息后面加上“$”关键字,这样客户端接收到这个关键字时,做相应处理。public static synchronized void sen

10、dclientlist() for(int j=0;jclientlist.size();j+) ServerHander allclients1=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.

11、out.flush(); catch(IOException exc) allclients1.interrupt(); else /老用户,只增加新来的用户 ServerHander allclients3=clientlist.lastElement(); try allclients1.out.writeUTF(allclients3.who+$); allclients1.out.flush(); catch(IOException exc) allclients1.interrupt(); 4.ServerHander模块: 关键模块,与客户端进行消息的交互,相互加关键字,解密关键字

12、,做到上下线提醒,群聊,私聊等功能。创建ServerHander的Vector对象,可以方便用户管理,Vector对象是可变数组,而且支持线程同步,适合在网络编程中使用。对用户发送过来的消息通过关键字进行解析,前面的字符串为发送的消息,后面的字符串为发送对象,若发送给所有人,则直接发送,若发送给某个人,则在发送的消息后面再加上关键字,让客户端去解析。有用户下线,发送下线消息,通过下线关键字,可以在客户端更新用户列表。class ServerHander extends Thread Socket socket; DataInputStream in; DataOutputStream out;

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

14、tream(socket.getOutputStream(); public void run() try clientlist.addElement(this); /VECTOR中增加新线程 sendallclient(who+ 上线); sendclientlist(); /为每一个客户端更新在线用户 while(true) String msg=in.readUTF(); int index = msg.lastIndexOf(); /对客户端发过来的信息做相应的处理 String str = msg.substring(index+1,msg.length(); /取得发送对象和发送的

15、消息 msg=msg.substring(0,index); if(str.equals(所有人)=false) sendallclient(who+ 对+str+ 说: +msg+); /不是发给所有人则增添标记 else sendallclient(who+ 对所有人 说: +msg); catch(IOException e) System.out.println(error); finally clientlist.removeElement(this); System.out.print(Client +(ip:+socket.getInetAddress()+)+who+ 退出!+

16、n); sendallclient(who+ 下线); try socket.close(); catch(IOException ex) System.out.println(clsing); 3.2 客户端实现 1.ServerFrame窗口界面模块:有一个消息显示文本区域,消息发送框,发送按钮,好友列表下拉框,一条标签用来显示在线人数,文本区域添加在JscrollPane上,这样,无论消息有多长,多宽,都能显示出来,如果没添加的话,消息一多,就显示不出了,这个小细节,很多人都没注意。class ServiceFrame extends Frame JTextArea showAT; JT

17、extField sendFD; JComboBox friendlist; JButton but; JLabel showCount; JScrollPane textAreaScrollPane; 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

18、); showAT.setEditable(false); textAreaScrollPane = new JScrollPane(showAT); add(textAreaScrollPane, BorderLayout.CENTER); add(textFieldPanel, BorderLayout.SOUTH); friendlist = new JComboBox(); friendlist.addItem(所有人); textFieldPanel.add(friendlist); sendFD = new JTextField(20); textFieldPanel.add(se

19、ndFD); but = new JButton(发送); but.setMnemonic(KeyEvent.VK_ENTER); textFieldPanel.add(but); showCount = new JLabel(在线人数:1); textFieldPanel.add(showCount); show(); 按钮监听事件:当按下按钮,把发送文本框的消息再加上当前选择的发送对象写入输出流,中间用关键字隔开,在服务端方便解析。class ActListener implements ActionListener Client client; ServiceFrame sframe;

20、public ActListener(Client c,ServiceFrame sf) client=c; sframe=sf; public void actionPerformed(ActionEvent e) /发送信息,并以作为私聊标记client.send(sframe.sendFD.getText().trim()+sframe.friendlist.getSelectedItem(); sframe.sendFD.setText( ); 退出事件:添加退出功能,不然直接点叉叉退出,会报错。class ExitListener extends WindowAdapter Clie

21、nt client; public ExitListener(Client c) client=c; public void windowClosing(WindowEvent e) client.close(); System.exit(0); 2.Client类模块:关键模块,通过服务器IP地址与端口建立连接,在控制台输入名字,发送给服务器,服务器会进行上线提醒与更新用户列表的操作。public class Client public ServiceFrame sf; private Socket csocket; private DataInputStream in; private D

22、ataOutputStream out; public static void main(String args) BufferedReader in = new BufferedReader(new InputStreamReader(System.in); System.out.println(请输入一个名字: ); String who= ; try who=in.readLine().trim(); /控制台获得名字 catch(IOException e) e.printStackTrace(); new Client(who,127.0.0.1,9992); 在Client的构造函

23、数中实现对服务器消息的解析,接受消息str11. 若str1以$结尾,说明是有用户上线,在所有用户消息区域显示该消息,并且更新每一个用户的好友列表。2. 若str1以结尾,说明这是一条私聊消息,解析其中的名字信息,若该用户的名字在里面,才显示该消息。3. 若str1以下线结尾,说明有用户下线,在所有用户消息区域显示该消息,并在所有用户的用户列表中删除该用户的信息最后,显示当前在线人数。public Client(String who,String server,int port) sf=new ServiceFrame(who+ 的客户端); String str1 = null; sf.bu

24、t.addActionListener(new ActListener(this,sf); sf.addWindowListener(new ExitListener(this); try csocket =new Socket(server,port); in=new DataInputStream(new BufferedInputStream(csocket.getInputStream(); out=new DataOutputStream(new BufferedOutputStream(csocket.getOutputStream(); out.writeUTF(who); ou

25、t.flush(); /名字发给服务器 while(true) str1 = in.readUTF(); /重点!,服务器端发来的消息 if(str1.endsWith($) /若以$结尾,则增添用户 int index = str1.lastIndexOf($); String str2 = str1.substring(0,index); sf.friendlist.addItem(str2.trim(); else if(str1.endsWith() /以结尾为私聊信息 str1=str1.substring(0,str1.length()-1); if(str1.contains(w

26、ho) sf.showAT.append(- +str1+n); else if(str1.endsWith(下线) /用户下线,删除此用户 int index = str1.lastIndexOf(下线); String str2 = str1.substring(0,index); sf.friendlist.removeItem(str2.trim(); sf.showAT.append(- +str1+n); sf.showCount.setText(在线人数:+(sf.friendlist.getItemCount()-1); /动态更新在线人数 catch(Exception e)

27、 System.out.println(Server Error); this.close(); System.exit(0); 第四章 运行结果1.服务器控制台显示并记录登录,退出信息。2.在客户端控制台输入名字进入聊天室。 3.聊天界面显示客户端名字,好友列表,在线人数等信息。4.私聊,群聊显示,若选择所有人则为群聊,选择某一个人,则为私聊。如下图,群聊消息,在所有客户端都显示,私聊信息只会在发送者与接受者中显示。 5.人数动态刷新。 第五章 课程设计总结从收到题目的茫然无措,不知从何下手,到最后交出的成果,真的让我学到了很多,可能比一学期的JAVA和网络课程设计中学到的关于TCP协议的知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。说说完成课程设计的整个过程吧。刚看到可以选择的六个题目时,犹如晴天霹雳,别说用代码实现了,连题目要求都不理解,上课恍惚听老师提到过这个知识点,可是重要的内容却一点也不知道,而且,由于要做图形界面,所以用JAVA会更简单点,但JAVA也忘得差不多了,所以只能从头

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

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