⽤JAVA实现P2P⽹络通信
导读:
  摘 要:分析了P2P基本概念及其基本⼯作原理,探讨了⽤JAVA实现p2p⽹络通信的技术,并⽤⼀个实例作了进⼀步阐述。
  关键词:P2P,C/S,JAVA,XML,JDK ,TCP,UDP
  ⼀、 前⾔
  P2P(Peer-to-Peer 端到端)模型是与C/S(客户/服务器)模型相对应。基于C/S的⽤户间通信需要由服务器中转,在C/S中的服务器故障将导致整个⽹络通信的瘫痪。。⽽基于P2P的⽤户间通信则是直接通信,去掉了服务器这⼀层,带来的显著优点是通信时没有单⼀的失败点,⼀个⽤户的故障不会影响整个P2P⽹络。本⽂提供了⼀种⽤JAVA实现P2P⽹络通信的⽅法。 
  ⼆、P2P通信的关键技术分析
  (⼀) 信息的传递
  1.P2P通信模型
  由上图可以看出,在P2P⽹络中,任意两个端点之间可实现直接通信。在基于C/S的⽹络中,客户端可以通过向服务器注册来实现彼此之间的定位(获得IP和端⼝)。对于P2P⽹络中,是如何实现彼此之间的定位和通信,下⾯做⼀阐述。
  2.获得⽹络中可以通信端点的IP和端⼝
  假设有⼀个端点A,欲和P2P⽹络中其他端点通信,在通信之前,端点A必须⾸先把⾃⼰的IP和端⼝通知P2P⽹络中的其他每⼀个端点。其他每个端点收到这个信息后,就获得了端点A的IP和端⼝,随后向端点A反馈⾃⼰的IP和端⼝信息,使端点A也获得P2P⽹络中每个端点的IP和端⼝。
  这⾥有两个技术可以完成端点A向其他端点通知其IP和端⼝的⼯作,⼀是⼴播技术,⼆是多播技术。
  ⼴播技术主要在局域⽹中使⽤,在局域⽹中的每⼀个端点(主机)都不得不接受并处理⼀个⼴播数据包。因此为了避免⽹络阻塞,路由器均限制⼴播数据包的通过。所以设计基于互联⽹的P2P程序不适合采⽤⼴播技术。
  多播技术是⼀种允许⼀个或多个发送者(多播源)发送单⼀的数据包到多个接收者(⼀次的,同时的)的⽹络技术。 多播源把数据包发送到特定多播组,⽽只有属于该多播组的地址才能接收到数据包。多播可以⼤⼤的节省⽹络带宽,提⾼了数据传送效率。减少了主⼲⽹出现拥塞的可能性。多播组
中的端点(主机)可以是在同⼀个物理⽹络, 也可以来⾃不同的物理⽹络(如果有多播路由器的⽀持)。因此,多播技术是我们的选择。
  在JAVA中,发送和接收多播信息的⽅法:
  发送多播信息需经历步骤
  确定发送的具体信息内容
  String msg = "Hello";
  选⽤专门为多播指定的D类IP地址(224.0.0.1到239.255.255.255),创建⼀个多播组
  InetAddress group = ByName("228.5.6.7");
  使⽤指定的端⼝(⼀般选1024以上的端⼝号)建⽴多播套接字
  MulticastSocket s = new MulticastSocket(6789);
  加⼊多播组
  s.joinGroup(group);
  创建⼀个数据报封装多播信息
  DatagramPacket hi = new Bytes(), msg.length(),
  group, 6789);
  发送
  s.send(hi);
  接收多播信息的步骤
  开辟接收缓冲区
  byte[] buf = new byte[1000];
  创建接收数据报
  DatagramPacket recv = new DatagramPacket(buf, buf.length);
  接收
java xml是什么  s.receive(recv);
  注意:以上发送和接收程序在同⼀个⽂件中实现,若在不同⽂件中实现则应分别定义多播套接字并加⼊多播组。
  3.与已知IP和端⼝的端点通信
  在互联⽹上主要采⽤TCP和UDP来实现两点之间的通信。采⽤TCP可可靠传送信息,但花费时间较多;采⽤UDP可快速传递信息,但不能保证可靠传递。
  JAVA实现TCP通信的⽅法
  利⽤Socket(InetAddress addr, int port)和 Socket(String host, int port),创建客户端套接字,利⽤ServerSocket(int port)创建服务器端套接字,port端⼝就是服务器监听连接请求的端⼝,通过调⽤accept()返回⼀个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端⼝号。通过调⽤Socket的 getInputStream()⽅法获得输⼊流读传送来的信息,也可能通过调⽤Socket的
getOutputStream()⽅法获得输出流来发送消息。
  JAVA实现UDP通信的⽅法
  使⽤DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 确定数据包数组、数组的长度、数据包的地址和端⼝信息。使⽤DatagramSocket()创建客户端套接字,⽽服务器端则采⽤DatagramSocket(int port),调⽤send(DatagramPacket dgp)和receive(DatagramPacket dgp)来发送和接收数据包。本⽂设计的程序采⽤UDP。
  (⼆)信息的表⽰
  使⽤XML技术
  XML是以⽂本数据为基础的⾮常灵活的格式。在通信过程中,传输的数据虽然可以根据实际需要指定任意格式。但在应⽤中⼴泛选择XML,原因是,XML提供了切合实际的并能清楚描述和易于读写的格式。编写XML⽂件和解析XML⽂件的⼯作均容易完成。通过⽂本编辑器可以⽤100%的纯ASCII⽂本来书写XML⽂件。XML的解析⼯作既可⾃⼰编程来实现,也可以采⽤多家公司提供的XML解析器。由于XML是⼀种国际标准,采⽤XML对于程序将来功能的扩展也可带来很多好处。
  (三) 信息的响应
  在通信过程中,信息的响应是⾄关重要的。对于实时通信系统P2P,更看重信息响应的速度。本⽂所设计的P2P通信程序提⾼响应速度主要从下⾯两个⽅⾯进⾏了处理。
  1. 队列
  由于P2P⽹络中的端点(主机)通常要接收来⾃很多端点的信息,如果程序等处理完⼀个信息后,再接收新的信息,势必会导致某些信息的遗漏。所以接收信息的程序只管把接收到的信息放⼊队列缓冲,处理信息的程序则从队列中依次取出信息进⾏处理。
  2. 多线程
  JAVA中的多线程技术可以使多段程序同时运⾏。利⽤多线程技术可以把⽤户界⾯、信息接收、信息处理分别处理,使程序更加稳定流畅,⼤⼤提⾼了信息的响应速度。
  三、P2P通信程序实例
  (⼀) 功能描述
  本程序是⼀个P2P通信程序,使⽤此软件的⽤户可以建⽴P2P通信⽹络。⽹络中的⽤户之间可以⽅便地通信。同时,此⽹络是动态的,换句话说,⽤户可以随时加⼊和退出此⽹络。
  主要功能有:
  获得P2P⽹络中端点(主机)的IP,并动态更新
  可以向任何已知IP的端点发送⽂本信息
  可以接收其他端点发送的⽂本信息
  可以获得某些端点退出⽹络的信息
  功能在⽤户界⾯上的体现
  (⼆) 程序框架
  1. 信息流图
  信息流图描述了信息的发送和接收过程。事实上,每个端点必须同时具有发送和接收信息的功能,因此,上图的功能将集成在⼀个⽤户程序中。
  2. 类表
  根据信息流图,确定相应的类实现其功能。
  (⼆)程序流图
  四、结束语
  本程序旨在构建P2P⽹络通信的基本框架,故程序提供的功能较为简单,如只能交换⽂本信息,⽹络套接字端⼝固定等。读者可以在此基础上扩展其功能,如实现⽂件传输、动态分配端⼝等。
本⽂转⾃

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。