点对点数据交换P2P.docx
- 文档编号:3840003
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:23
- 大小:149.19KB
点对点数据交换P2P.docx
《点对点数据交换P2P.docx》由会员分享,可在线阅读,更多相关《点对点数据交换P2P.docx(23页珍藏版)》请在冰豆网上搜索。
点对点数据交换P2P
内容提要
这次计算机网络课程设计,我们小组做的题目是《点对点数据交换(P2P):
实现基于服务器转发的任意多点间的数据共享与交换》,具体来说,我们的目标是做一个简单的局域网聊天程序。
第一部分 需求分析
第二部分 总体设计
第三部分 详细设计
第四部分 参考文献
第五部分 系统编码实现
一需求分析
P2P,英文Peer-to-Peer的缩写,中译为对等互联或点对点技术。
P2P技术可以让用户可以直接连接到其他用户的计算机,进行文件共享与交换,同时P2P在深度搜索、分布计算、协同工作等方面也大有用途。
简单地说,P2P就是一种用于不同PC用户之间,不经过中继设备直接交换数据或服务的技术,它允许Internet用户直接使用对方的文件。
每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。
目前Internet的存储模式是"内容位于中心",而P2P技术的运用将使Internet上的内容向边缘移动。
这将带来以下改变:
首先,客户不再需要将文件上传到服务器,而只需要使用P2P与其他计算机进行共享;
其次,使用P2P技术的计算机不需要固定的IP地址和永久的Internet连接,这使得占有极大比例的拨号上网用户也可以享受P2P带来的变革。
(1)系统目的,要求
我们小组做的题目是《点对点数据交换(P2P):
实现基于服务器转发的任意多点间的数据共享与交换》,具体来说,我们的目标是做一个简单的局域网聊天程序,要实现的功能如下:
1 用户应该可以注册,选择服务器登陆。
2 实现多对多聊天。
3客户端程序应该可以实时显示目前登陆该服务器的客户,
4有一个简单,便于操作的界面。
(2)操作流程
用户操作流程:
客户端与服务器端通信流程:
(3)开发工具与开发平台
开发语言:
JAVA
开发环境:
eclipse3.2,WindowsXP
二总体设计
(1)系统功能
该系统的主要功能是实现多个用户之间在同一服务器上的客户之间的数据共享。
是基于服务器转发的。
采用线程池技术,每发起一个连接,就创建一个线程,连接结束后,线程结束,并有一个线程计数器,每隔一定时间就刷新数据。
(2)系统架构
采用C/S模式,各个用户通过服务器转发实现P2P聊天的功能
(3)模块划分
分为两大模块:
客户端模块和服务器端模块。
客户端模块的主要功能:
1登陆功能:
用户可以注册,然后选择服务器登入聊天室。
2显示用户:
将在线用户显示在列表中。
3接收信息:
能接收其他用户发出的信息。
4发送信息:
能发出用户要发出的信息。
服务器端模块的主要功能:
1检验登陆信息:
检查登陆信息是否正确,并向客户端返回登陆信息,如信息正确。
就允许用户登陆。
2显示在线状态:
将该用户的状态发给各在线用户。
3转发聊天信息:
将消息转发给所有在线的用户。
三详细设计
(1)系统数据结构
1、服务器:
负责处理各个客户端的信息,并负责将信息进行转发。
①、服务器主要负责响应客户端的的各种信息,包括用户的登陆,用户的注册,各个客户端的信息相互转发。
②、服务器的实现有以下几个类构成:
AppServer类,Connect类,其中AppServer类主要是进行初始化的工作,Connect类负责对用户登陆信息,各个客户端信息的处理。
2、客户端:
用户使用界面,负责接受信息以及与服务器进行通信。
①、客户端负责为用户提供登陆界面,将信息发送至服务器,接受服务器的反馈信息等一系列的工作。
②、客户端的实现有以下几个类构成:
clientInt类,TimerAction类。
clientInt类进行登陆界面初始化的工作,TimerAction类负责与服务器,其它客户端进行通信。
(2)协议结构
程序采用UDP用户数据报协议(UserDatagramProtocol)来实现数据的传送。
用户数据报协议(UDP)是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
UDP协议基本上是IP协议与上层协议的接口。
UDP协议适用端口分辨运行在同一台设备上的多个应用程序。
由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。
这是通过使用UDP的“端口号”完成的。
例如,如果一个工作站希望在工作站128.1.123.1上使用域名服务系统,它就会给数据包一个目的地址128.1.123.1,并在UDP头插入目标端口号53。
源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。
与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。
由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。
UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。
UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。
●SourcePort—16位。
源端口是可选字段。
当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。
如果不使用,设置值为0。
●DestinationPort—16位。
目标端口在特殊因特网目标地址的情况下具有意义。
●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程序设计之网络编程 李芝兴、杨瑞龙清华大学出版社2006年3月
五系统编码实现:
服务器代码:
packagechat;
//导入相关包
importjava.awt.event.*;
import.*;
importjava.io.*;
importjava.util.*;
importjavax.swing.Timer;
//AppServer类代码
publicclassAppServerimplementsRunnable
{
ServerSocketserver;//创建绑定到特定端口的服务器套接字
SocketfromClient;
ThreadserverThread;
publicstaticfinalintPORT=8080;
publicAppServer()
{
System.out.print("聊天服务器已经启动.");
try
{
server=newServerSocket(PORT);
serverThread=newThread(this);//创建AppServer的线程实例
serverThread.start();
}
catch(Exceptione)
{
System.out.println("不能启动该线程:
"+e);
}
}//构造AppServer结束
publicvoidrun()
{
try
{
while(true)
{
//监听客户端的请求
fromClient=server.accept();
//建立连接对象
Connectcon=newConnect(fromClient);
}
}
catch(Exceptione)
{
System.out.println("不能监听客户请求"+e);
}
}
publicstaticvoidmain(Stringargs[])
{
newAppServer();
}
}//AppServer类定义结束
//connect类代码
classConnect
{
ObjectOutputStreamstreamToClient;
BufferedReaderstreamFromClient;
booleanstatus=false;
staticVectorvector;//聊天信息
staticVectoruserList;
staticStringstr=newString("用户列表");
Stringmessage="";
static
{
vector=newVector(1,1);
userList=newVector(1,1);
userList.addElement((String)str);
}
publicConnect(SocketinFromClient)
{
//提取客户端的流
Stringmsg="";
try
{
streamFromClient=newBufferedReader(newInputStreamReader(inFromClient.getInputStream()));
streamToClient=newObjectOutputStream(inFromClient.getOutputStream());
msg=streamFromClient.readLine();
if((msg.equals("Timer"))) //延迟信息
{
streamToClient.writeObject(vector);
streamToClient.writeObject(userList);
}
elseif(msg.equals("LoginInfo")) //登录信息
{
msg=streamFromClient.readLine();
booleanIsOk=verify(msg);
if(IsOk=true)
{
Stringcolon=newString(":
");
intindex=((String)msg).lastIndexOf(colon);
StringuserName=(String)msg.substring(0,index);//从第一个字符开始截取字符串,得到用户名
if((userList.indexOf((String)userName)>0))
{
streamToClient.writeObject("Welcome");
}
else
{
userList.addElement((String)userName); //是新注册的用户则添加进入用户列表
}
}
else
{
streamToClient.writeObject("LoginFailed");
}
}
elseif(msg.equals("RegisterInfo"))//注册信息
{
msg=streamFromClient.readLine();
booleanIsExist=checkUser(msg);
if(IsExist==true)
streamToClient.writeObject("UserExists");
else
{
FileOutputStreamout=newFileOutputStream("G:
\\UsrPwd.txt",true);
PrintStreamp=newPrintStream(out);
p.println();
p.println(msg);
p.close();
streamToClient.writeObject("Registered");
}
}
elseif(msg.equals("UserLogout"))
{
StringremUser=streamFromClient.readLine();
booleanb=userList.removeElement((String)remUser);
}
else
{
message=message+msg;
vector.addElement((String)message);
streamToClient.writeObject(vector);
}
}//endoftry
catch(Exceptione)
{
System.out.println("无法获取客户端的流对象"+e);
}
finally //关闭套接字
{
try
{
inFromClient.close();
}
catch(IOExceptione)
{
}
}
}//Connect()函数结束
booleanverify(Stringmesg)
{
try
{
RandomAccessFileRAS=newRandomAccessFile("G:
\\UsrPwd.txt","r");
inti=0;
Stringstr="";
while((RAS.getFilePointer())!
=(RAS.length()))
{
str=RAS.readLine();
if(str.equals(mesg))
{
status=false;
returnstatus;
}
}
RAS.close();
}
catch(Exceptione)
{
System.out.println("用户数据丢失");//存储用户认证文本丢失
}
returnstatus;
}//verify()函数结束
booleancheckUser(Stringmesg)
{
booleanIsExist=false;//检测是否存在相同用户名,存在为TRUE
try
{
RandomAccessFileRS=newRandomAccessFile("G:
\\UsrPwd.txt","r");
inti=0;
Stringstr="";
Stringcolon=newString(":
");
intindex=((String)mesg).lastIndexOf(colon);
StringuserName=(String)mesg.substring(0,index);
while((RS.getFilePointer())!
=(int)(RS.length()))
{
str=RS.readLine();
intindex1=((String)str).lastIndexOf(colon);
StringusrName=(String)str.substring(0,index1);
if(usrName.equals(userName))
{
IsExist=true;
break;
}
}//while结束
RS.close();
}//try块结束
catch(Exceptione)
{
}
returnIsExist;
}//chkFile()函数结束
}
客户端代码:
packagechat;
importjava.io.*;
import.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.awt.*;
importjava.util.*;
importjavax.swing.Timer;
publicclassclientIntextendsJFrameimplementsActionListener{
Timert=newTimer(5000,newTimerAction());
Stringusr_name;
publicStringremUser;
//InetAddressIPadr=InetAddress.getByAddress(127,0,0,1);
//StringIPadr="localhost";
classTimerActionimplementsActionListener
{
SockettoServer;
ObjectInputStreamstreamFromServer;
PrintStreamstreamToServer;
publicvoidactionPerformed(ActionEvente2)
{
try{
toServer=newSocket(Login.IPadr,AppServer.PORT);
streamFromServer=newObjectInputStream(toServer.getInputStream());
streamToServer=newPrintStream(toServer.getOutputStream());
message=txtMsg.getText();
//向服务器发送一消息
streamToServer.println("Timer");
//从服务器端接收Vector向量
Vectorvector=(Vector)streamFromServer.readObject();//接收消息
Vectorvector1=(Vector)streamFromServer.readObject();//接收用户
//显示在线用户
txtListUsers.setText("");
for(intj=1;j { txtListUsers.append((String)vector1.elementAt(j)); txtListUsers.append("\n"); } //显示该消息 inti=messageCount; for(;i { txtMessages.append((String)vector.elementAt(i)); txtMessages.append("\n"); } messageCount=i; }//try块尾 catch(Exceptione) { //System.out.println("产生异常"+e); } }//actionPerformed函数尾 }//TimerListener类结束 intmessageCount=0;//消息数量 Stringname; PrintStream streamToServer; ObjectInputStreamstreamFromServer; SockettoServer; JTextAreatxtMessages; JTextAreatxtListUsers; JTextFieldtxtMsg; JButtonmsgSendBtn; JButtonuserLoginBtn; JButtonuserRegisterBtn; JButtonuserLogoutBtn; JLabellblChatRoom; JLabellblUserList; JScrollPanejspSendMsgPane; JScrollPanejspTxtMsgPane; JScrollPanejspUserListPane; JTextFieldtextWriteMsg; Stringmessage; intnSend; publicclientInt(Stringnm){ remUser=nm; usr_name=nm; this.setTitle("聊天室: "+usr_name);//设定窗体标题 JPanelpanel=newJPanel(); panel.setLayout(newGridBagLayout()); GridBagConstraintsgbCons=newGridBagConstraints(); gbCons.gridx=0; gbCons.gridy=0; lblChatRoom=newJLabel("聊天室",SwingConstants.LEFT); panel.add(lblChatRoom,gbCons); gbCons.gridx=1; gbCons.gridy=0; lblUserList=newJLabel("在线用户",SwingConstants.LEFT); panel
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点对点 数据 交换 P2P