ToB企服应用市场:ToB评测及商务社交产业平台

标题: 基于Python socket库构建的基于 P2P 的文件共享系统示例 [打印本页]

作者: 锦通    时间: 7 小时前
标题: 基于Python socket库构建的基于 P2P 的文件共享系统示例
基于 P2P 的文件共享系统

实现方式:

利用 Python 的socket库构建 P2P 网络,节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表,并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时,它会向网络中的其他节点发送查询哀求,拥有该文件的节点相应并提供文件传输服务。可以利用分布式哈希表(DHT)算法,如bittorrent中利用的 Kademlia 算法,来更高效地定位文件所在节点。
代码示例

简单模仿 P2P 文件共享中节点间文件查询功能
  1. import socket
  2. import threading
  3. class P2PNode:
  4.     def __init__(self, host, port):
  5.         self.host = host
  6.         self.port = port
  7.         self.files = []
  8.         self.peer_list = []
  9.         self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  10.         self.sock.bind((self.host, self.port))
  11.         self.receive_thread = threading.Thread(target=self.receive_messages)
  12.         self.receive_thread.start()
  13.     def share_file(self, file_name):
  14.         self.files.append(file_name)
  15.         self.broadcast_file_list()
  16.     def broadcast_file_list(self):
  17.         for peer in self.peer_list:
  18.             file_list_str = ','.join(self.files)
  19.             self.sock.sendto(file_list_str.encode(), peer)
  20.     def find_file(self, file_name):
  21.         for peer in self.peer_list:
  22.             self.sock.sendto(f'FIND {file_name}'.encode(), peer)
  23.     def receive_messages(self):
  24.         while True:
  25.             data, addr = self.sock.recvfrom(1024)
  26.             message = data.decode()
  27.             if message.startswith('FIND'):
  28.                 _, target_file = message.split()
  29.                 if target_file in self.files:
  30.                     self.sock.sendto(f'HAVE {target_file} {self.host}:{self.port}'.encode(), addr)
  31.             else:
  32.                 received_files = message.split(',')
  33.                 self.peer_list.append(addr)
  34.                 for file in received_files:
  35.                     if file not in self.files:
  36.                         self.files.append(file)
  37. if __name__ == "__main__":
  38.     node1 = P2PNode('127.0.0.1', 8890)
  39.     node2 = P2PNode('127.0.0.1', 8891)
  40.     node1.share_file('example.txt')
  41.     node2.find_file('example.txt')
复制代码
应用场景

实用于小型局域网内的文件共享,在没有中央服务器的情况下,方便用户之间直接互换文件,节省服务器成本和带宽资源。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4