title: p2plearning
date: 2020-07-13 15:25:07
tags: java
一 、P2P
计网的一个课设
基于P2P的局域网即时通信系统
1.实现一个图形用户界面局域网内的消息系统。
2.功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口使用3000。
2.1用户注册及对等方列表的获取:对等方A启动后,用户设置自己的信息(用户名,所在组);扫描网段中在线的对等方(3000端口打开),向所有在线对等方的服务端口发送消息,接收方接收到消息后,把对等方A加入到自己的用户列表中,并发应答消息;对等方A把回应消息的其它对等方加入用户列表。双方交换的消息格式自己根据需要定义,至少包括用户名、IP地址。
2.2发送消息和文件:用户在列表中选择用户,与用户建立TCP连接,发送文件或消息。
3.用户界面:界面上包括对等方列表;消息显示列表;消息输入框;文件传输进程显示及操作按钮或菜单。
p2p主要的实现前提是,两端应用要交互通信就必须知道对方的IP地址,因此为了获取两个通信方的IP,需要采用UDP多播的通信技术。
1.1 UDP广播
1.1.1 广播的概念
使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。
网络上的广播指:由一台主机向该主机所在子网内(同一个局域网)的所有主机发送数据的方式。
1.1.2 广播的特点
实现广播,离不开广播地址,同一个子网(局域网)的所有主机网卡都会接收所在网段广播地址的数据包。广播地址应用于局域网内的所有主机。广播地址(Broadcast Address)是专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址。
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。
其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。
- 可以向广播域内的所有主机发送数据 ;
- 不能够跨越不同的网络,被路由器所隔离开。
1.2多播的特点
1.2.1 多播的概念
单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途。
IP 多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的 TCP/IP 网络技术。
1.3 UDP的java实现
DatagramSocket 和 DatagramPacket 两个类是 基于UDP 协议进行通信的包装类
实现两个客户端通过 UDP协议通信,使用DatagramSocket 和 DatagramPacket类
DatagramSocket 就相当于码头,DatagramPacket相当于海上的货物。
有如下几个步骤,分为客户端和服务端。
1,客户端:
1),实例化DatagramSocket类(带上指定端口),创建客户端
2),准备数据,数据是以字节数组发送的
3),打包数据,使用 DatagramPacket 类 + 服务器地址+ 端口
4),发送数据
5),关闭连接
2,服务端
1),实例化DatagramSocket类+指定端口
2),准备接收的字节数组,封装 DatagramPacket
3),接受数据
4),解析数据
5),关闭连接
二、P2P即使聊天实现逻辑
- 一个用户上线之后,用UDP向局域网内的所有用户广播一句消息“我上线了”,并打开自己的服务接入监听线程
- 用户收到“我上线了”或“我收到了”的消息之后把对应的用户名和ip地址存入自己的本地,然后回复“我收到了”,若是收到“我下线了,则把对应的用户移除”
- 在在线列表中点击一个用户时,发起TCP连接,新开一个聊天窗口,作为用户端与服务端通信。 另一边的用户检测到接入时新开一个聊天窗口,并作为服务端开始与客户端进行通信。
以上就是基本的实现逻辑。每一台机器叫做对等方。