用JAVA实现P2P网络通信

一、 前言 
    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程序不适合采用广播技术。
   多播技术是一种允许一个或多个发送者(多播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。 多播源把数据包发送到特定多播组,而只有属于该多播组的地址才能接收到数据包。多播可以大大的节省网络带宽,提高了数据传送效率。减少了主干网出现拥塞的可能性。多播组中的端点(主机)可以是在同一个物理网络, 也可以来自不同的物理网络(如果有多播路由器的支持)。因此,多播技术是我们的选择。

注:广播同一客户端只能运行一个(端口占用),多播不会;

 

关于广播、多播 请见:http://oma1989.iteye.com/blog/1967744

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Java实现P2P即时通信的步骤: 1.创建一个ServerSocket对象,指定端口号,等待客户端连接。 2.创建一个Socket对象,指定服务器IP地址和端口号,连接服务器。 3.使用Socket对象的getInputStream()和getOutputStream()方法获取输入输出流,进行数据的读写。 4.使用线程来处理客户端的请求,避免阻塞主线程。 5.使用Java的GUI库(如Swing或JavaFX)创建用户界面,实现聊天窗口和输入框等组件。 6.使用Java的网络编程库(如Java NIO)实现多人在线同时聊天的功能。 以下是一个简单的Java P2P即时通信的示例代码: ```java import java.io.*; import java.net.*; public class ChatServer { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8888); System.out.println("Server started."); Socket socket = server.accept(); System.out.println("Client connected."); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); String line; while ((line = in.readLine()) != null) { System.out.println("Client: " + line); out.println("Server: " + line); } in.close(); out.close(); socket.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } } import java.io.*; import java.net.*; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); System.out.println("Connected to server."); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = reader.readLine()) != null) { out.println(line); System.out.println("Server: " + in.readLine()); } in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值