基于 P2P 的文件共享系统
实现方式:
使用 Python 的socket
库构建 P2P 网络,节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表,并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时,它会向网络中的其他节点发送查询请求,拥有该文件的节点响应并提供文件传输服务。可以利用分布式哈希表(DHT)算法,如bittorrent
中使用的 Kademlia 算法,来更高效地定位文件所在节点。
代码示例
简单模拟 P2P 文件共享中节点间文件查询功能
import socket
import threading
class P2PNode:
def __init__(self, host, port):
self.host = host
self.port = port
self.files = []
self.peer_list = []
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((self.host, self.port))
self.receive_thread = threading.Thread(target=self.receive_messages)
self.receive_thread.start()
def share_file(self, file_name):
self.files.append(file_name)
self.broadcast_file_list()
def broadcast_file_list(self):
for peer in self.peer_list:
file_list_str = ','.join(self.files)
self.sock.sendto(file_list_str.encode(), peer)
def find_file(self, file_name):
for peer in self.peer_list:
self.sock.sendto(f'FIND {file_name}'.encode(), peer)
def receive_messages(self):
while True:
data, addr = self.sock.recvfrom(1024)
message = data.decode()
if message.startswith('FIND'):
_, target_file = message.split()
if target_file in self.files:
self.sock.sendto(f'HAVE {target_file} {self.host}:{self.port}'.encode(), addr)
else:
received_files = message.split(',')
self.peer_list.append(addr)
for file in received_files:
if file not in self.files:
self.files.append(file)
if __name__ == "__main__":
node1 = P2PNode('127.0.0.1', 8890)
node2 = P2PNode('127.0.0.1', 8891)
node1.share_file('example.txt')
node2.find_file('example.txt')
应用场景
适用于小型局域网内的文件共享,在没有中央服务器的情况下,方便用户之间直接交换文件,节省服务器成本和带宽资源。