




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、内容提要这次计算机网络课程设计,我们小组做的题目是点对点数据交换(P2R:实现基于服务器转发的任意多点间的数据共享与交换,具体来说,我们的目标是做一个简单的局域网聊天 程序。目录第一部分需求分析第二部分总体设计第三部分详细设计第四部分参考文献第五部分系统编码实现一需求分析P2P,英文Peer-to-Peer的缩写,中译为对等互联或点对点技术。P2P技术可以让用户 可以直接连接到其他用户的计算机,进行文件共享与交换,同时 P2P在深度搜索、分布计算、 协同工作等方面也大有用途。简单地说,P2P就是一种用于不同PC用户之间,不经过中继设备直接交换数据或服务的 技术,它允许In ternet用户直接
2、使用对方的文件。每个人可以直接连接到其他用户的计算机, 并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。目前In ternet的存储模式是内容位于中心,而P2P技术的运用将使In ternet上的内 容向边缘移动。这将带来以下改变:首先,客户不再需要将文件上传到服务器,而只需要使用P2P与其他计算机进行共享;其次,使用P2P技术的计算机不需要固定的IP地址和永久的In ternet连接,这使得占有 极大比例的拨号上网用户也可以享受 P2P带来的变革。(1)系统目的,要求我们小组做的题目是点对点数据交换(P2P:实现基于服务器转发的任意多点间的数 据共享与交换,具体来说,我们的目标是做
3、一个简单的局域网聊天程序,要实现的功能如下:1用户应该可以注册,选择服务器登陆。2实现多对多聊天。3客户端程序应该可以实时显示目前登陆该服务器的客户,4有一个简单,便于操作的界面。(2)操作流程用户操作流程:客户端,启动程序若正确则继续用户登陆,验证用户名,密码,建立连接启动客户端 线程,聊天用户用户说话退出服务器监听客户端信息流系统流程图客户端与服务器端通信流程:用户注册到服务器/服登陆系陆,务客/服务器获取器户端发送消息,1端服务器转发serverClie nt退出系统客户,服务器端通信图(3)开发工具与开发平台开发语言:JAVA开发环境:eclipse 3.2,Windows XP二总体
4、设计(1)系统功能该系统的主要功能是实现多个用户之间在同一服务器上的客户之间的数据共享。是基于 服务器转发的。采用线程池技术,每发起一个连接,就创建一个线程,连接结束后,线程结 束,并有一个线程计数器,每隔一定时间就刷新数据。(2) 系统架构采用C/S模式,各个用户通过服务器转发实现 P2P聊天的功能接收信息发岀信息显示在线状态转发聊天信息(3) 模块划分分为两大模块:客户端模块和服务器端模块。客户端模块的主要功能:1登陆功能:用户可以注册,然后选择服务器登入聊天室2显示用户:将在线用户显示在列表中。3接收信息:能接收其他用户发出的信息。4发送信息:能发出用户要发出的信息。登陆功能服务器端模块
5、的主要功能:1检验登陆信息:检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确 就允许用户登陆。2显示在线状态:将该用户的状态发给各在线用户。3转发聊天信息:将消息转发给所有在线的用户。三详细设计(1) 系统数据结构1、服务器:负责处理各个客户端的信息,并负责将信息进行转发。、服务器主要负责响应客户端的的各种信息,包括用户的登陆,用户的注册,各个客户端的信息相互转发。、服务器的实现有以下几个类构成:AppServer类,Connect类,其中AppServer类主 要是进行初始化的工作,Conn ect类负责对用户登陆信息,各个客户端信息的处理。2、客户端:用户使用界面,负责接受信息以及
6、与服务器进行通信。 、客户端负责为用户提供登陆界面,将信息发送至服务器,接受服务器的反馈信息等 一系列的工作。 、客户端的实现有以下几个类构成:clientlnt 类,TimerAction类。clientlnt 类进行登陆界面初始化的工作,TimerAction类负责与服务器,其它客户端进行通信。(2)协议结构程序采用UDP用户数据报协议(User Datagram Protocol )来实现数据的传送。用户数据报协议(UDP是ISO参考模型中一种无连接的传输层协议,提供面向事务 的简单不可靠信息传送服务。UDP协议基本上是IP协议与上层协议的接口。 UDP协议 适用端口分辨运行在同一台设备
7、上的多个应用程序。由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器 上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。 这是通过使用UDP的“端口号”完成的。例如,如果一个工作站希望在工作站 上使 用域名服务系统,它就会给数据包一个目的地址 ,并在UDP头插入目标端 口号53 。源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。 由于UDP比较简单,UDP头包含很少的字节
8、,比TCP负载消耗少。UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和 流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系 统(NFS、简单网络管理协议(SNMP、域名系统(DNS以及简单文件传输系统(TFTP。1632bitSource portDestination portLength匚 hecksumData*Source Port 16位。源端口是可选字段。当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。如果不使用,设置值为0。*Destination Port 16位。目标端口在特殊因
9、特网目标地址的情况下具有意义。*Length 16位。该用户数据报的八位长度,包括协议头和数据。长度最小值为8。*Checksum 16位。IP协议头、UDP协议头和数据位,最后用0填补的信息假协议头总 和。如果必要的话,可以由两个八位复合而成。*Data 包含上层数据信息。(3)数据流程图4)实验效果图登陆:注册:聊天:四参考文献【1】计算机网络第 4版 谢希仁电子工业出版社2003年.6月【2】用TCP/IP进行网络互联(第一卷) D.E.Comer电子工业出版社2004年.11月第四版【3】TCP/IP网络原理与技术周明天、汪文勇:清华大学出版社:1993【4】JAVA程序设计之网络编程
10、李芝兴、杨瑞龙清华大学出版社2006年3月五系统编码实现:服务器代码:package chat;/导入相关包import java.awt.event.*;import .*;import java.io.*;import java.util.*;import javax.swing.Timer;/AppServer 类代码public class AppServer implements RunnableServerSocket server ; /创建绑定到特定端口的服务器套接字Socket fromClient ;Thread serverThread ;publicstatic fin
11、alint POR= 8080;public AppServer。System. out .print(聊天服务器已经启动.);tryserver = new ServerSocket( PORTserverThread = newThread( this );/ 创建 AppServer 的线程实例serverThread .start();catch (Exception e)System. out.println(不能启动该线程:+ e); / 构造AppServer结束public void run()while ( true )/监听客户端的请求fromClient= server
12、.accept。;/建立连接对象Connect con =new Connect( fromClient );catch (Exception e)System. out .println(不能监听客户请求 + e); publicstatic void main(String args)new AppServer();/ AppServer类定义结束/c onnect 类代码class ConnectObjectOutputStream streamToClie ntBufferedReader streamFromClie ntboolean status = falsestaticVec
13、tor vector ; / 聊天信息staticVector userList ;staticString str = new String(用户列表);Stri ngmessage =;staticvector = new Vector(1, 1); userList = new Vector(1, 1);userList .addElement(String)str);public Conn ect(Socket inF romClie nt) /提取客户端的流String msg =;streamFromClie nt= new BufferedReader( newIn putStr
14、eamReader(i nF romClie nt.getl nputStream();streamToClie nt = new ObjectOutputStream(i nF romClie nt.getOutputStream();msg = streamFromClie nt .readL in e();if (msg.equals( Timer) streamToClie nt .writeObject( streamToClie nt .writeObject( else if (msg.equals( LoginInfo/延迟信息vector );userList );)/登录信
15、息msg = streamFromClie nt .readL in e(); boolean IsOk = verify(msg);if (IsOk = true )String colon = new String( :);int index = (String)msg).lastIndexOf(colon);String userName = (String)msg.substring(0, index);串,得到用户名if ( userList .indexOf(String)userName) 0)streamToClient.writeObject( Welcome);else/从
16、第一个字符开始截取字符列表userList .addElement(String)userName);/是新注册的用户则添加进入用户elsestreamToClie nt .writeObject(Logi n Failed );else if (msg.equals(RegisterInfo) / 注册信息msg = streamFromClie nt .readL in e();boolean IsExist = checkUser(msg);if (IsExist = true )streamToClie nt .writeObject( User Exists);elsetrue );
17、FileOutputStream out = new FileOutputStream( G:UsrPwd.txt Pri ntStream p = new Prin tStream(out);p.pr intln();p.pr in tl n( msg);p.close(); streamToClie nt .writeObject( Registered);else if (msg.equals( User Logout)Stri ng remUser = streamFromClie nt .readL in e();boolean b = userList .removeElement
18、(String)remUser);elsemessage = message + msg;vector .addElement(String) message);streamToClient .writeObject( vector ); /end of trycatch (Exception e)System. out.println(无法获取客户端的流对象“ + e);fin ally /关闭套接字tryinF romClie nt.close();catch (IOException e) /Co nn ect()函数结束boolean verify(String mesg)tryRan
19、domAccessFile RAS =new RandomAccessFile( G:UsrPwd.txt , r);int i = 0;String str =;while (RAS.getFilePointer() != (RAS.Iength()str = RAS.readLi ne();if (str.equals(mesg)status = false ;return status ;RAS.close();catch (Exception e)System. out .println (用户数据丢失”);/存储用户认证文本丢失return status ; /verify()函数结
20、束boolean checkUser(String mesg)boolean IsExist = false ; /检测是否存在相同用户名,存在为TRUEtryRandomAccessFile RS =new RandomAccessFile( G:UsrPwd.txt , r);int i = 0;String str =;String colon =newString(:);int index = (String)mesg).lastlndexOf(colon);String userName = (String)mesg.substring(0, index);while (RS.get
21、FilePointer() != (int )(RS.length()str = RS.readLi ne();int index1 = (String)str).lastIndexOf(colon);String usrName = (String)str.substring(0, index1);if (usrName.equals(userName)IsExist = true ;break ;/while 结束RS.close();/try 块结束catch (Exception e)return IsExist; chkFile()函数结束客户端代码:package chat;imp
22、ortjava.io.*;importjava .n et.*;importjavax.swi ng.*;importjava.awt.eve nt.*;importjava.awt.*;importjava.util.*;importjavax.sw in g.Timer;public class clientlntextends JFrame implements ActionListener Timer t = new Timer(5000,newTimerAction();Stringusr_ name;public Str ingremUser;/In etAddress IPadr
23、 = In etAddress.getByAddress(127,0,0,1);/String IPadr = localhost;class TimerActionimplements ActionListenerSocket toServer ;ObjectInputStream streamFromServer ;PrintStreamstreamToServer ;public void acti on Performed(Acti on Eve nt e2)try toServer = new Socket(Login. IPadr, AppServer. PORT;streamFr
24、omServer = new ObjectInputStream(toServer .getInputStream();streamToServer = new PrintStream(toServer .getOutputStream();message = txtMsg .getText();/向服务器发送一消息streamToServer .println(Timer);/从服务器端接收Vector向量Vector vector = (Vector)streamFromServer .readObject();/ 接收消息Vector vector1 =(Vector)streamFro
25、mServer .readObject();/ 接收用户/显示在线用户txtListUsers.setText();for (int j = 1;jvector1.capacity(); j+)txtListUsers.append (String)vector1.elementAt(j);txtListUsers.append( n);/显示该消息int i = messageCount;for (;i vector.capacity();i+)txtMessages .append(String)vector.elementAt(i); txtMessages .append( n);me
26、ssageCou nt = i;/ try 块尾catch (Exception e)/System.out.println(产生异常+e); / actio “Performed函数尾 / TimerListe ner 类结束int messageCount = 0;/ 消息数量String n amePrintStreamstreamToServer ;ObjectInputStream streamFromServer ;Socket toServer ;JTextArea txtMessages ;JTextArea txtListUsers ;JTextField txtMsg ;J
27、Butt on msgSe ndBt n;JButt on userLog inBtn ;JButt on userRegisterBt n;JButt on userLogoutBt n ;JLabel lblChatRoom ;JLabel lblUserList ;JScrollPanejspSendMsgPane ;JScrollPanejspTxtMsgPane ;JScrollPa nejspUserListPa ne;JTextField textWriteMsg ;String message;int nSend;public clientInt(String nm)remUs
28、er = nm;JScrollPa ne( txtListUsers,JScrollPa ne.VERTICAL_SCROLLBAR_AS_NEPane.HORIZONTAL_SCROLLBusr_ name = nm;this .setTitle(聊天室:+usr_name); / 设定窗体标题JPa nel panel =new JPa nel();pan el.setLayout(new GridBagLayout();GridBagC on stra ints gbC ons =n ewGridBagC on stra in ts();gbCons. gridx = 0;gbCons.
29、 gridy = 0;lblChatRoom = new JLabel(聊天室, SwingConstants.LEFT;panel.add( lblChatRoom , gbCons);gbC ons. gridx = 1;gbCons. gridy = 0;lblUserList = new JLabel(在线用户,SwingConstants.LEFT;pan el.add( lblUserList, gbC on s);gbCons. gridx = 0;gbCons. gridy = 1;gbCons. gridwidth= 1;gbCons. gridheight= 1;gbCon
30、s. weightx = 1.0;gbCons. weighty = 1.0;txtMessages = new JTextArea(25,35);txtMessages .setEditable( false ); jspTxtMsgPa ne = newR_AS_NEEDEDpanel.add(jspTxtMsgPane , gbCons);gbCons. gridx = 1;gbCons. gridy = 1;gbCons. gridwidth= 1;gbCons. gridheight= 1;gbCons. weightx = 1.0;gbCons. weighty = 1.0;txt
31、ListUsers = new JTextArea(25,10);txtListUsers .setEditable( false );jspUserListPa ne= newAR_AS_NEEDEDpan el.add( jspUserListPa ne , gbC on s);gbCons. gridx = 0;gbCons. gridy = 2;gbCons. gridwidth= 1;JScrollPane( txtMessages ,JScrollPane.VERTICAL_SCROLLBAR_AS_NE櫃 DIESDPane.HORIZONTAL_SCROLLBAgbCons.
32、gridheight= 1;gbCons. weightx = 1.0;gbCons. weighty = 1.0; txtMsg = new JTextField(35);jspSe ndMsgPa ne = newJScrollPane( txtMsg ,JScrollPane.VERTICAL_SCROLLBAR_AS_NEESDlrSDPane.HORIZONTAL_SCROLLBAR_AS_NEEDEDpan el.add( jspSe ndMsgPa ne, gbC on s);gbCons. gridx = 1;gbCons. gridy = 2;gbCons. gridwidt
33、h= 1;gbCons. gridheight= 1;gbCons. weightx = 1.0;gbCons. weighty = 1.0;gbCons. anchor = GridBagConstraints.WESTmsgSendBtn = new JButton(发送);pan el.add( msgSe ndBt n, gbC on s);msgSendBtn.addActionListener(this );JPa nel btnPanel =new JPan el();userLogoutBtn = new JButton(退岀);userLogoutBtn .addAction
34、Listener(this );/向窗体添加事件侦听器this .addWindowListener(new Win dowAdapter()public void windowClosing(WindowEvent e1)try Socket toServer;ObjectI nputStream streamFromServer;Pri ntStream streamToServer;toServer =new Socket(Login.IPadr ,AppServer. PORT;streamToServer = new Pri ntStream(toServer.getOutputSt
35、ream(); streamToServer.pri ntln(User Logout);streamToServer.pri ntl n(remUser);/ try 块尾catch (Exception e2)System. out.println(” 发生异常:+e2););btnPanel.add( userLogoutBtn );gbCons. gridx = 0;gbCons. gridy = 3;gbCons. gridwidth= 1;gbCons. gridheight= 1;gbCons. weightx = 1.0;gbCons. weighty = 1.0;gbCons
36、. anchor = GridBagConstraints.EASTgbCons. fill= GridBagConstraints.HORIZONTALpan el.add(bt nPan el, gbC on s);getC onten tPa ne().add(pa nel);setDefaultCloseOperatio n(EXIT_ON_CLOSEsetSize(560,580);Dime nsion scree n=Toolkit.getDefaultToolkit().getScree nSize();setLocation(screen.width -560)/2,(scre
37、en.height -580)/2);setVisible( true );setResizable( false );t .start();/ clie ntln t()函数结束public void acti on Performed(Acti on Eve nt e1)JButton button = (JButto n)e1.getSource();/若单击退出按钮,触发此事件if (button.equals(userLogoutBtn )trytoServer = new Socket(Login.IPadr ,AppServer. PORT;streamToServer = ne
38、w PrintStream( toServer .getOutputStream(); /退岀时,向服务器发送退岀消息streamToServer .println(User Logout);streamToServer .println(remUser);catch (Exception e)System. out .println(发生异常:+e);this .dispose();/若单击“发送”按钮elsetry toServer = new Socket(Login.IPadr ,AppServer. PORT;streamFromServer = new ObjectInputStream( toServer .getInputStream(); streamToServer = new PrintStream(toServer .getOutputStream();message = txtMsg .getText(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-北京-北京汽车驾驶与维修员一级(高级技师)历年参考题库含答案解析
- 2025年中级卫生职称-主治医师-重症医学(中级)代码:359历年参考题库典型考点含答案解析
- 2025年通信专业技术-通信专业技术(中级)-中级通信专业技术(设备环境实务)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-汽轮机本体检修工-汽轮机本体检修工(高级)历年参考题库含答案解析(5套)
- 2025年职业技能鉴定-供水供应工-供水供应工证(高级)历年参考题库含答案解析(5套)
- 2025年综合评标专家-湖北-湖北综合评标专家(交通运输厅)历年参考题库含答案解析(5套)
- 热电厂锅炉安全知识培训课件
- 季氏将伐颛臾课件
- 烟草公司消防知识培训课件
- 烟花爆竹基础知识培训课件
- 号线项目tcms便携式测试单元ptu软件使用说明
- 艺术课程标准(2022年版)
- 癫痫所致精神障碍
- 卫生部手术分级目录(2023年1月份修订)
- 电荷及其守恒定律、库仑定律巩固练习
- YY 0666-2008针尖锋利度和强度试验方法
- GB/T 6663.1-2007直热式负温度系数热敏电阻器第1部分:总规范
- 小沈阳《四大才子》欢乐喜剧人台词
- 全套课件-水利工程管理信息技术
- 缝纫机线迹图示教学课件
- 2022年衡阳市南岳区社区工作者招聘笔试题库及答案解析
评论
0/150
提交评论