




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中南大学 CENTRAL SOUTH UNIVERSITY 计算机网络课程设计报告 学生姓名 学 号 班 级 计算机0908班 指导教师 阳旺 设计时间 2012.1.72012.1.10 目录第一章 设计目的、任务1.1设计目的31.2设计的任务 3第二章 系统分析设计2.1系统流程分析42.2系统功能需求分析52.3系统运行要求62.4系统数据要求6第三章 系统实现3.1 系统界面设计 73.2 系统功能模块设计9第四章 体会和建议 第一章 设计目的、任务1.1设计目的1了解通信规范的细节及其实现。2通过本次网络课程设计,掌握高级编程语言中对用户界面的设计方法,以及多线程技术、基于TCP/IP的Socket通信的编程方法,同时能够把协议的设计思想应用到实际中去。1.2设计的任务编写一个聊天室,实现C/S模式的会话。基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。网络聊天是网络编程的典型应用之一,编写网络聊天软件对于学习网络编程无疑有着很大的帮助。第二章 系统分析设计2.1系统流程分析该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。因此,系统需要实现服务器端和客户端两部分程序。下图是基本的客户端连接服务器的流程图。ClientServer建立服务器监听socket建立连接创建socket向服务器发请求等待并接收连接请求接收请求后创建socket连接开始通信InputStreamInputStreamOutputStreamOutputStream结束通信关闭socket关闭socket对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。首先是客户端的登陆,客户端在登陆时,必须设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。对于客户端的各种请求,实际上都是通过在客户发往服务器的各种字符流区分的,具体的方法就是在消息的头部以及尾部添加特殊字符串,从而实现服务器对消息请求的识别。比如对于登陆信息,消息的头部就是“PEOPLO”,而对于私聊中的消息,头部就是“SEC”,其他的同理都添加了头部。当然,对于客户端来说,这些都是透明的,用户的操作并没有受到任何影响。在服务器端,消息被检测分析后,变回根据具体的目的进行处理,比如是私聊消息,服务器便会根据其尾部的目的信息,向目标端转发该条消息。这里额外要说的是,该系统特别的对用户发来的消息进行了加密处理,即用户的各种具体信息,不仅能够防止向第三方的泄漏,而且即使服务器端出现异常,信息也不会泄漏。对于私聊的方式,该系统所采用的方法类似于QQ的通信方式,由发起方主动连接,当目的方接收到连接请求后,会主动建立一个私聊窗口,从而 实现私聊。2.2系统功能需求分析本系统所要实现的主要功能是为用户提供一个借助网络进行人际交往的平台。因为服务端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用TCP/IP协议进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。本系统主要通过客户端,服务器端来体现聊天系统的基本功能,两者主要的功能如下所示。(1)服务器端1. 处理用户登录2. 处理用户的各种信息,包括状态信息、聊天信息等3. 监控聊天内容,过滤非法内容,并对不法用户实现拉入黑名单4. 处理用户退出(2)客户端 1. 用户登录2. 用户发送信息3. 用户接收信息4. 用户之间的群聊5. 用户之间的私聊6、消息发来时,发出提示声音7. 显示当前在线用户列表,并且同步更新8. 用户私人信息的加密处理9. 用户退出2.3系统运行要求运行环境:Windows 9x、2000、XP、Windows 7必要环境:JDK 1.6以上、eclipse开发环境硬件环境:CPU 400MHz以上,内存512MB以上2.4系统数据要求1、系统中数据的传送是以字符串的形式传送的。对于不同请求信息的区分是通过在字符串的头部添加系统信息实现的。这些系统信息包括:PEOPLO、QUIT、SEC、MIMI、MSG。PEOPLO代表该条信息是用户的登陆信息,QUIT代表该条信息是用户的登出信息,SEC代表该条信息是用户的私聊信息,MIMI代表该条信息是用户向另一个用户发起的建立私聊请求,MSG代表该条信息是用户发出的公聊信息。2、在系统中,用户发出的各种私人信息都是在客户端进行加密的,然后服务器端转发到另一个用户后,在用户端再进行解密处理。第三章 系统实现3.1 系统界面设计1、服务器端 (1)服务器运行中的界面图如下所示: 2、客户端(1)客户端运行后的登陆界面图如下所示:(2)客户端运行后的主界面图如下所示: (3)客户端运行后的私聊界面图如下所示:3.2 系统功能模块设计1、服务器创建Serversocket,使用本地IP以及端口(port)1234建立套接字对网络进行监听,并对发来请求的客户创建连接,分配服务线程firstthread。实现该功能的代码如下所示:listen = new ServerSocket(PORT);/创建一个服务器,进行监听try while (true) / 保持监听客户端的请求Socket client = listen.accept();/服务器监听st.append(n新客户机器的IP地址: + client.getInetAddress();firstthread f = new firstthread(this, client); / 为每一个客户创建一个客户端线程f.start(); / 客户端线程启动clients.addElement(f); / 将面向客户端的线程加入向量列表中st.append(n聊天室当前人数: + clients.size() + n);/添加显示新用户的信息,当用户退出时可以把新的数量提示服务器显示 catch (IOException e) System.err.println(error: + e);System.exit(1);2、服务器端对用户发来的头部带有MSG的公聊消息,进行广播。下面是实现对消息进行广播,即发往所有用户的功能模块:public void broadcast(String msg) firstthread you;for (int i = 0; i clients.size(); i+) you = (firstthread) clients.elementAt(i);try you.out.writeUTF(msg);/向输出流写入信息 catch (IOException e) 2、服务器端对用户发来的头部带有SEC的私聊消息,进行单播。下面是实现对消息进行单播,即发往某单个用户的功能模块:/ 向某个人发送悄悄话public void broadcast1(String msg) String s1, s2, s3;firstthread you;s1 = new String(PEOPLE);/加上PEOPLE表示为新人消息s2 = new String(msg.substring(3); / “SEC为3个字符所以从第3个开始截取s3 = s1.concat(s2);/连接字符串for (int i = 0; i =0)String as1=MIMI.concat(line.substring(3, line.indexOf()+1).concat(服务器 );JOptionPane.showMessageDialog(null, as1);as1=sx.jiaMi(as1,a);server.broadcast2(as1);String as=SEC.concat(line.substring(3, line.indexOf().concat(你已经因敏感词汇被拉入黑名单!(服务器);as1=sx.jiaMi(as1,a);server.broadcast1(as);elseline=sx.jiaMi(line,a);server.broadcast(line);/ 线路信息前端为“SEC”表明接收到的是单播else if (line.startsWith(SEC) this.out.writeUTF(line); / 在自己的文本区显示server.broadcast1(line); / 在对方文本区显示/MIMIelse if (line.startsWith(MIMI) server.broadcast2(line); / 在对方文本区显示/ 线路信息前端为newlist表明得到客户端刷新列表的请求else if (line.startsWith(newlist) try for (int i = 0; i server.clients.size(); i+) firstthread c = (firstthread) (server.clients.elementAt(i);if ( != null) try firstout.writeUTF( + *);/更新列表 catch (IOException e) catch (ArrayIndexOutOfBoundsException e) catch (NullPointerException e) catch (IOException e) server.clients.removeElement(this);/ 抛出异常的话就删除该线程 catch (NullPointerException e) server.clients.removeElement(this);6、当客户端登陆成功后,客户端会产生聊天室主界面。实现该功能的代码如下:public void init(String host) setLayout(new BorderLayout();/布局管理器b = new Bpanel();c = new Cpanel();setBounds(wx / 2 - 300, hy / 2 - 300, 777, 600);setTitle(姗姗聊天室);ImageIcon icon=new ImageIcon(src/qq/images/qqlogo.png); /设置图标 setIconImage(icon.getImage();setResizable(false);add(North, b);add(Center, c);c.button1.addActionListener(this);/7个按钮的监听c.button22.addActionListener(this);c.button.addActionListener(this);c.button2.addActionListener(this);c.button3.addActionListener(this);b.b2.list.addActionListener(this);/双击列表人名的监听this.setForeground(Color.black);this.setForeground(new Color(52, 133, 203);c.msg_txt.setBackground(Color.white);b.chat_txt.setBackground(Color.white);b.chat_txt.setForeground(Color.black);b.chat_txt.setFont(new Font(宋体, Font.BOLD, 13);addWindowListener(new WindowAdapter() / 窗口右上角关闭按钮,直接点击也会发送登出信息public void windowClosing(WindowEvent e) try out.writeUTF(QUIT); catch (IOException es) /发给服务器);try socket = new Socket(host, PORT);/客户端创建socketin = new DataInputStream(socket.getInputStream();out = new DataOutputStream(socket.getOutputStream(); catch (IOException e) System.exit(1);say( 欢迎来到姗姗聊天室 );/创建线程if (t = null) t = new Thread(this);/t.setPriority(Thread.MIN_PRIORITY);t.start();/调用run方法setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗口关闭时,立即结束线程/setResizable(true);setVisible(true);7、客户端接收的信息都是由服务器转发的,所以客户端会对服务器发来的信息进行识别处理,从而判断出信息是属于控制信息还是聊天信息,同时客户端还要对信息的头部进行处理,将一些系统标识符去掉,实现对客户的透明传输。实现该功能的代码如下所示:public void run() try while (true) line = in.readUTF();Mima sx=new Mima();if (line.startsWith(PEOPLE) String listString = line;/这是其他用户发来的个人列表信息if (line.endsWith(*) listString = line.substring(0, (line.length() - 1); / 去掉名字信息后面的*号;b.b2.list.add(listString.substring(6)/新人到来信息,在文件区显示if (!line.endsWith(*) int last = line.indexOf();String equalname = line.substring(6, last+1);try new MP3Player(); catch (NoPlayerException e) e.printStackTrace(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();b.chat_txt.append(n欢迎+equalname+ 来到聊天室 + n);else if (line.startsWith(QUIT) String str;int len = line.length();/判断line的长度,以判断是否没有进入就退出if(len 10)str = line.substring(4); / QUIT为4个字符else str = line.substring(10); / QUIT+PEOPLE为10个字符try for (int i = 0, k = 0; i = 133; i+) String s = b.b2.list.getItem(i); if (s.equals(str) / 判断某人是离开聊天室的人k = i;b.b2.list.remove(k); / list列表中清除此人int last = line.indexOf();String equalname = line.substring(10, last+1);try new MP3Player(); catch (NoPlayerException e) e.printStackTrace(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();b.chat_txt.append(equalname+ 开始潜水了 + n); / 显示某人离开了聊天室 catch (ArrayIndexOutOfBoundsException e) / 以MSG开头,表明接收到的是普通聊天话语信息else if (sx.jieMi(line,a).startsWith(MSG) try new MP3Player(); catch (NoPlayerException e) e.printStackTrace(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); b.chat_txt.append(n+sx.jieMi(line,a).substring(3) + n);else if (line.startsWith(MIMI)|sx.jieMi(line,a).startsWith(MIMI) if(sx.jieMi(line,a).startsWith(MIMI)line=sx.jieMi(line,a); int k = line.indexOf();/】出现的位置,即可知整个用户名String sd=line.substring(k+1);/去掉前面的MIMI还有接受者也Miao=sd;/静态的可以直接赋值Mywindow mywindow = new Mywindow();try new MP3Player(); catch (NoPlayerException e) e.printStackTrace(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();mywindow.setVisible(true); / 线路信息前端为“SEC”表明接收到悄悄话else if (line.startsWith(SEC) try new MP3Player(); catch (NoPlayerException e) e.printStackTrace(); catch (MalformedURLException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); Mywindow.txtx.append(密语:+line.substring(line.indexOf()+1, line.indexOf()+1)+ n); / 在自己主动创建的文本区显示悄悄话,同样去掉了自己的名字,不显示末尾是发自谁()/ end sec/end while catch (Exception e) e.printStackTrace();say( 再见!欢迎再来聊天室);8、客户端发送信息是通过点击相关的按钮实现的所以可以对按钮添加几个监听,从而实现对信息的头部添加以及向服务器的发送。实现该功能的代码如下:public void actionPerformed(ActionEvent e) if (e.getSource() = c.button1&haha=0) name = AdaLx;xingbie=AdaLogin.sexx;try out.writeUTF(PEOPLE + name + + xingbie + + InetAddress.getLocalHost().getHostAddress();/真正进入聊天室时。自己主动发送enter = 1;haha=1; catch (IOException e1) / 向服务器写入进入聊天室信息,enter标志置1,已进入聊天室else if (e.getSource() = c.button22) try out.writeUTF(QUIT);/发给服务器enter = 0; / 离开聊天室,enter置0catch (Exception e1) b.b2.list.removeAll(); / 清除聊天人员列表setVisible(false);else if (e.getSource() = c.button & enter = 1) if (name != null) try Mima sxs=new Mima();out.writeUTF(sxs.jiaMi(MSG + name + + xingbie + + 说: + c.msg_txt.getText(),a);c.msg_txt.setText(null); / 发送完毕信息清空写信息文本框 catch (IOException e1) / 双击击了聊天人员列表中的某人 B2panel中的list 弹出窗口发送悄悄xiaxielse if (e.getSource() = b.b2.list & enter = 1) String ssname = (List) e.getSource().getSelectedItem();int k = ssname.indexOf();ssname = ssname.substring(0, k+1);/取接受端的名字try out.writeUTF(MIMI + ssname+name + + xingbie + );/ssname是对方的名字(因为从列表取出所以带有性别),name是主动发起方的名字 catch (IOException e1) Miao=ssname;Mywindow mywindow = new Mywindow();mywindow.setVisible(true);/ 清空聊天文本区Cpanel中的c.button2else if (e.getSource() = c.button2) b.chat_txt.setText(null); / 清空聊天列表区按钮 Cpanel中的c.button3else if (e.getSource() = c.button3) try b.b2.list.removeAll();out.writeUTF(newlist);/ 刷新聊天人员列表 catch (IOException e1) 9、对于私聊功能,本系统是通过由服务器接收到某个客户端的私聊请求后,向目标端发送特殊字符“MIMI”,客户端收到后变回主动建立私聊窗口,然后双方正常通信,但信息只有双方才能看到。实现该功能的代码如下所示:Mywindow() super(私聊窗口:+miliao);/miliao是双击列表时,传送的用户参数ImageIcon icon=new ImageIcon(src/qq/images/qqlogo.png); /设置图标 setIconImage(icon.getImage();this.setLayout(new BorderLayout();/布局管理器text2 = new TextField(2);txtx = new TextArea(13, 13);txtx.setEditable(false);button1 = new Button(发送悄悄话);add(Center,text2);add(North,txtx);add(South,button1);setBounds(300, 300, 533, 333);setResizable(false);button1.addActionListener(this);addWindowListener(new WindowAdapter() / 使窗口右上角关闭按钮可以用public void windowClosing(WindowEvent e) setVisible(false);dispose(););/ 处理按钮事件的方法public void actionPerformed(ActionEvent e) if (e.getSource() = button1) / 向服务器发送悄悄话try Client.out.writeUTF(SEC + miliao + text2.getText() + (消息来自 + C + ); catch (IOException e1) text2.setText(); 10、本系统实现了客户端收到消息时的声音提示,主要就是在现实消息之前播放客户端的一段音频。实现该功能的代码如下:public MP3Player() throws NoPlayerException,MalformedURLException, IOException String fileName = src/Client/message.wav; final Player player = Manager.createPlayer(new File(fileName).toURI().toURL(); player.prefetch();/预读取 player.start();11、对于客户所发送的信息,本系统可以对其进行加密处理,然后在对方的客户端再进行解密处理。实现该功能的代码如下所示:public class Mima /加密 public String jiaMi(String s,String key) String str = ; int ch; if(key.length() = 0) return s; else if(!s.equals(null) for(int i = 0,j = 0;i key.length() - 1) j = j % key.length();/始终用key来加密,超过时回退 ch = s.codePointAt(i) + key.codePointAt(j);/返回Unicode编码值 if(ch 65535) ch = ch % 65535;/最大数65535 str += (char)ch; return str; /解密 public String jieMi(String s,String key) String str = ; int ch; if(key.length() = 0) return s; else if(!s.equals(key) for(int i = 0,j = 0;i key.length() - 1) j = j % key.length(); ch = (s.codePointAt(i) + 65535 - key.codePointAt(j);/始终加上65535,以免加密结果大于65535 if(ch 65535) ch = ch % 65535;/ch - 33 = (ch - 33) % 95 ; str += (char)ch; return str; 第四章 体会和建议本次的网络课程设计到现在算是结束了,但是它对我的影响还没有结束,因为本次的系统开发带给我很多的经验与教训,对我以后的学习仍然会产生巨大的作用。此次,我开发聊天室系统是用了Java编程语言,我仅仅是学了半个学期的Java语言。Java是一门应用广泛并且实用性极强的高级程序设计语言。通过本次课程设计,我对面向对象的基本思想有了进一步的理解,将课上学习的理论知识运用到了实际当中。我对项目开发的各个阶段任务也有了一定的了解。设计开始阶段必须明确设计的目的与需求分析,总体设计要全面分析聊天室系统的架构。通过这次设计,使我认识到体系的架构是最重要的,只有准确的系统设计、很好的定义各个模块及模块之间的关系,才能在编码阶段更轻松的实现。这次程序设计也是一个毅力的考验过程。有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。此次的网络课程设计不仅加深了我对面向对象语言的熟练程度,而且使我切身实地的接触了网络编程的方法,通过了解网络协议的说明,进而对TCP/IP进行实现,给我带来了很多乐趣。但同时由于能力有限,还存在着许多不足之处。如:1、写代码急躁。写代码过程中经常出现报错的情况,常常要花好长时间寻找错误。有时只是单纯的语法错误就会困惑好久。2、考虑问题不够全面。因为之前写的程序都是单纯的具有一项功能,各部分部件关键不多,而这次的聊天室系统包含了各种各样的功能。如果协调不好,就会非常麻烦。3、此次的课程设计,更让我体会到了同学们之间,互相帮助对软件开发的重要作用。编写这些代码需要很多方面的知识,一个人要想全面掌握有些困难。众人合力往往效率会提高很多。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正掌握这门技术。 最后,能够完成本次的网络课设,我还是非常的开心和有成就感的,也要感谢我的辅导老师阳旺老师对我的大力帮助与支持。袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木门合同协议书
- 历年中考英语2014年江苏南京英语试卷+答案+解析
- 纺织品检验员考试技巧探讨试题及答案
- 商场门面买卖合同协议书
- 兼职设计合同协议书
- 视光科合作合同协议书
- 织物物理性能标准考题试题及答案
- 2025年环保行业新兴材料应用与发展趋势报告
- 电梯检测合同协议书
- 耗材合同协议书
- 沉浸式学习让你学习更高效课件高二下学期高效学习主题班会
- 国家开放大学《管理信息系统》大作业参考答案
- TCAICC 001-2024 张家界莓茶质量等级评价
- 人教版一下数学克的认识公开课课件
- 走进重高-培优讲义-数学-八年级-上册-(浙教版)
- 初中物理竞赛练习题集(共14讲)含答案
- 2024年江苏省南京市联合体中考三模英语试题(解析版)
- 四年级数学脱式计算练习题100道
- 创新与发明-按图索骥、循章创新智慧树知到期末考试答案章节答案2024年广州大学
- 2024年山东高考化学真题试题(原卷版+含解析)
- 3.1.4 禁止编入列车的机车车辆课件讲解
评论
0/150
提交评论