java实现聊天系统计算机网络专业课程设计方案报告.doc
《java实现聊天系统计算机网络专业课程设计方案报告.doc》由会员分享,可在线阅读,更多相关《java实现聊天系统计算机网络专业课程设计方案报告.doc(35页珍藏版)》请在咨信网上搜索。
计算机网络课程设计汇报 学生姓名 学 号 班 级 指导老师 设计时间 目录 第一章 系统描述 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输入输出流做对应操作 ServerSocket(port) Socket socket= ServerSocket.accept() 接收连接 Close OutputStream InputStream Server 通信过程 Socket(host,port) 和服务器建立连接 Close OutputStream InputStream Client 二. 因为是多用户端,所以必需用线程进行控制,不一样处理线程为不一样用户服务,根本程只负责循环等候,处理线程负责网络连接,接收用户输入信息,再做对应处理。 1.4系统功效分析 本系统能够经过网络进行聊天,采取用户端服务器模式,所以程序介绍清楚易懂,而且用户全部是在用户端进行活动,方便对用户管理,也使得程序运行和差错简单起来。采取了多线程技术,能够做到多人同时在线,提升了系统性能,增强了系统实用性。有简单用户端界面,方便用户使用。采取是TCP协议,这是可靠,稳定协议,这么不会丢失任何包,也就不会丢失任何信息。 本系统实现功效有: 1. 用户名字登录 2. 用户之间群聊 3. 用户之间私聊 4. 动态刷新并显示好友列表 5. 显示在线人数 6. 服务器能够显示用户在线状态 7. 能够退出处理 8. 用户上下线提醒 第二章 功效模块结构 2.1 模块划分 服务器: Server类模块,ServerHanderson模块,sendallclient模块,sendclientlist模块 用户端: Client类模块, ServiceFrame窗口界面模块 ServerHander模块 2.2 模块结构图 ServerHander模块 Server模块 ServerHander模块 通信过程 建立连接 ServiceFrame模块 Client模块 2.3 模块功效 服务器: 1. Server类模块:和用户端建立连接,经过套接字取得名字,在控制端显示提醒信息 2. ServerHander模块:提供线程管理,实现多用户管理。针对每一个用户发过来消息,进行对应处理,再转发给用户。 3. Sendallclient模块:给每个用户发送消息。 4. Sendclientlist模块:每当有用户上线,更新每个用户用户列表。 用户端: 1. Client类模块:和服务端建立连接,用户登录,实现消息群聊,私聊,用户列表更新等功效。 2. ServiceFrame窗口界面模块:用户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。 第三章 模块算法实现 3.1 服务器实现 1. Server类模块:创建ServerSocket,在指定端口监听,当有用户登录,接收套接字输入流,显示其登录信息,调用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()+")"+who+" 进入!"+"\n"); ServerHander cn=new ServerHander(who,conn); cn.start(); } } 2. Sendallclient模块: 把msg消息发送给每一个用户。其中allclients是ServerHander枚举类型,能够指向每一个用户。 protected static void sendallclient(String msg){ synchronized (clientlist){ Enumeration <ServerHander> allclients=clientlist.elements(); while(allclients.hasMoreElements()) { ServerHander serh=(ServerHander)allclients.nextElement(); try{ serh.out.writeUTF(msg); serh.out.flush(); } catch(IOException exc){ serh.interrupt(); } } } } 3.Sendclientlist模块:更新用户列表,当有新用户上线时,对以前用户好友列表,加上这个新用户名字,对于这个新用户,加上全部用户名字。实现方法是在名字信息后面加上“$”关键字,这么用户端接收到这个关键字时,做对应处理。 public static synchronized void sendclientlist(){ for(int j=0;j<clientlist.size();j++) { ServerHander allclients1=clientlist.elementAt(j); if(j==clientlist.size()-1) //若是新增用户,把vector中全部用户全部发送过去 { for(int i = 0;i<clientlist.size();i++) { ServerHander allclients2=clientlist.elementAt(i); try{ allclients1.out.writeUTF(allclients2.who+"$"); allclients1.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模块: 关键模块,和用户端进行消息交互,相互加关键字,解密关键字,做到上下线提醒,群聊,私聊等功效。创建ServerHanderVector对象,能够方便用户管理,Vector对象是可变数组,而且支持线程同时,适合在网络编程中使用。对用户发送过来消息经过关键字@进行解析,@前面字符串为发送消息,后面字符串为发送对象,若发送给全部些人,则直接发送,若发送给某个人,则在发送消息后面再加上关键字@,让用户端去解析。有用户下线,发送下线消息,经过‘下线’关键字,能够在用户端更新用户列表。 class ServerHander extends Thread{ Socket socket; DataInputStream in; DataOutputStream out; String who; protected static Vector<ServerHander>clientlist=new Vector<ServerHander>() ; //把用户线程放入可变对象数组 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 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 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"); } finally{ clientlist.removeElement(this); System.out.print("Client" +"(ip:"+socket.getInetAddress()+")"+who+" 退出!"+"\n"); sendallclient(who+" 下线"); try{ socket.close(); } catch(IOException ex){ System.out.println("clsing"); } } } 3.2 用户端实现 1.ServerFrame窗口界面模块:有一个消息显示文本区域,消息发送框,发送按钮,好友列表下拉框,一条标签用来显示在线人数,文本区域添加在JscrollPane上,这么,不管消息有多长,多宽,全部能显示出来,假如没添加话,消息一多,就显示不出了,这个小细节,大家全部没注意。 class ServiceFrame extends Frame{ JTextArea showAT; JTextField 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); 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(sendFD); 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; 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{ Client 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 DataOutputStream 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结构函数中实现对服务器消息解析,接收消息str1 1. 若str1以$结尾,说明是有用户上线,在全部用户消息区域显示该消息,而且更新每一个用户好友列表。 2. 若str1以@结尾,说明这是一条私聊消息,解析其中名字信息,若该用户名字在里面,才显示该消息。 3. 若str1以‘下线’结尾,说明有用户下线,在全部用户消息区域显示该消息,并在全部用户用户列表中删除该用户信息 最终,显示目前在线人数。 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 DataInputStream(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("$"); 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(who)) 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){ System.out.println("Server Error"); this.close(); System.exit(0); } } 第四章 运行结果 1.服务器控制台显示并统计登录,退出信息。 2.在用户端控制台输入名字进入聊天室。 3.聊天界面显示用户端名字,好友列表,在线人数等信息。 4.私聊,群聊显示,若选择全部些人则为群聊,选择某一个人,则为私聊。 以下图,群聊消息,在全部用户端全部显示,私聊信息只会在发送者和接收者中显示。 5.人数动态刷新。 第五章 课程设计总结 从收到题目标茫然无措,不知从何下手,到最终交出结果,真让我学到了很多,可能比一学期JAVA和网络课程设计中学到相关TCP协议知识还要多,所以很感谢这次课程设计,有效果也很有意义,某种程度上比上课效果还好。 说说完成课程设计整个过程吧。刚看到能够选择六个题目时,如同晴天霹雳,别说用代码实现了,连题目要求全部不了解,上课恍惚听老师提到过这个知识点,可是关键内容却一点也不知道,而且,因为要做图形界面,所以用JAVA会更简单点,但JAVA也忘得差不多了,所以只能从头来过,刚开始3周,一点相关课程设计代码全部没写,拿着一本《从零开始学JAVA》把JAVA基础知识,尤其是相关网络编程,线程,图形界面知识,狠狠地补了一把,最终更看懂部分程序结构清楚,没有反射,泛型等高端使用方法程序了。在这过程中发觉,做一个一般网络聊天室,似乎不要用太多网络知识,知道Socokt和TCP使用即可,于是开始慢慢敲代码了。 先把服务器和用户端搭建起来,只能实现连接上作用,但什么功效全部没有,那时,认为能连接上了,那实现部分私聊,群聊功效应该很简单,但现实确是,只能脑中想象,真用代码实现,却总是错误百出,做心灰意冷,尤其是私聊功效实现,刚开始,想让服务器直接向接收者和发送者发送消息,但总是不如人意,折腾了大约一星期,才意识到TCP协议就是用自己定义部分规则,在服务器和用户端之间传输消息,能够添加关键字,再解析。于是才处理私聊问题,然后添加好友列表和更新好友功效也在跌跌撞撞中实现了。窗口布局,刚开始想用网格包布局,但用很不熟练,造成布局不理想,无奈,只能用最基础布局了,所以界面看上去很一般。想发送图片,却发觉文本区域根本不能显示图片,能用JEditorPane实现,但有BUG,不知怎样调试,书上,网上也没找到能处理措施,只能放弃了。 课程设计在这种不停学习和探索中差不多完成了,说说这次课程设计不足吧。 1. 学过知识不牢靠,所以花费了大量时间用来学习基础知识,那些应该在以前就掌握。 2. 程序界面很一般,像老师说一样,是最最古老聊天系统,没有什么花哨。 3. 没能实现附加功效,像加密传输,文件传送等功效。其实,挺遗憾,因为以前选修过密码学,应该能够实现简单DES加密。 4. 没有用到JDBC,把用户信息存放到数据库表中,实施账号密码登录,提升系统安全性。 做了这么多课程设计,最大体会就是用心去做,用心去学,你一定能学到很多知识,而且这是对学过知识应用,所以比单一上课更有意思。 对于自己能独立完成课程设计,还是颇为满意,最少努力没有白费,学到知识也很多,最关键应该是了解了TCP协议原理,并学会了简单应用,JAVA编程水平得到了一定提升,面向对象思想比以往更清楚了。 第六章 附录 6.1参考文件 《从零开始学JAVA》 王发波 中国铁道出版社 《Java 2实用教程》 耿祥文 清华大学出版社 6.2源代码 服务器代码: package service; import java.io.*; import java.util.*; import .*; public class Server { 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()+")"+who+" 进入!"+"\n"); ServerHander cn=new ServerHander(who,conn); cn.start(); } } public static void main(String []args)throws IOException{ new Server(9992); } } class ServerHander extends Thread{ Socket socket; DataInputStream in; DataOutputStream out; String who; protected static Vector<ServerHander>clientlist=new Vector<ServerHander>() ; //把用户线程放入可变对象数组 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 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 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"); } finally{ clientlist.removeElement(this); System.out.print("Client" +"(ip:"+socket.getInetAddress()+")"+who+" 退出!"+"\n"); sendallclient(who+" 下线"); try{ socket.close(); } catch(IOException ex){ System.out.println("clsing"); } } } //发送消息给全部用户 protected static void sendallclient(String msg){ synchronized (clientlist){ Enumeration <ServerHander> allclients=clientlist.elements(); while(allclients.hasMoreElements()) { ServerHander serh=(ServerHander)allclients.nextElement(); try{ serh.out.writeUTF(msg); serh.out.flush(); } catch(IOException exc){ serh.interrupt(); } } } } //更新用户列表 public static synchroni- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实现 聊天 系统 计算机网络 专业课程 设计方案 报告
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文