yyKin 发表于 2023-12-11 09:37

p2p点对点通信-python-socket

基于python的soket实现P2P点对点的通信。能点拨一下思路也行,跪求代码。{:1_889:}

milu1123 发表于 2023-12-11 09:48

服务端代码。。。。。


# 引入socket库,用于网络通信
import socket

# 引入threading库,用于多线程处理
import threading

# 定义一个名为Server的类,该类用于实现服务器端的功能
class Server:
    # 初始化方法,用于设置服务器地址和端口号,创建服务器socket对象,以及启动服务器
    def __init__(self, host='localhost', port=8000):
      # 设置服务器地址和端口号
      self.host = host
      self.port = port
      # 创建服务器socket对象,使用TCP协议和IPv4地址
      self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      # 将服务器socket对象绑定到指定的地址和端口号
      self.server_socket.bind((self.host, self.port))
      # 监听连接,等待客户端的连接请求
      self.server_socket.listen(1)
      # 初始化客户端列表,用于存储已连接的客户端socket对象
      self.clients = []
      # 启动服务器,设置运行状态为True,表示服务器正在运行
      self.running = True
      
    # 定义一个方法handle_client,用于处理客户端的连接请求和数据传输请求
    def handle_client(self, client_socket):
      # 当服务器正在运行时,循环处理客户端的数据传输请求
      while self.running:
            # 使用recv()方法接收客户端发送的数据,数据长度为1024字节
            data = client_socket.recv(1024)
            # 如果客户端关闭了连接,recv()方法会返回空字符串,此时跳出循环
            if not data:
                break
            # 打印接收到的数据,使用decode()方法将字节串解码为字符串
            print(f"Received from client: {data.decode()}")
            # 对于已连接的每个客户端,除了当前客户端之外,将收到的数据发送给其他客户端
            for client in self.clients:
                if client != client_socket:
                  client.send(data)
      
    # 定义一个方法start,用于启动服务器并处理客户端的连接请求和数据传输请求
    def start(self):
      # 打印服务器启动信息,包括服务器地址和端口号
      print(f"Server started on {self.host}:{self.port}")
      # 循环监听客户端的连接请求,并接受连接请求,同时启动一个新的线程来处理客户端的数据传输请求
      while self.running:
            client_socket, address = self.server_socket.accept()
            print(f"Accepted connection from {address}")
            client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))
            client_thread.start()
            # 将新连接的客户端socket对象添加到客户端列表中
            self.clients.append(client_socket)
      
    # 定义一个方法stop,用于关闭服务器并清理资源
    def stop(self):
      # 将运行状态设为False,表示服务器不再运行
      self.running = False
      # 关闭服务器socket对象,释放资源
      self.server_socket.close()
      # 对于已连接的每个客户端,关闭客户端socket对象,释放资源
      for client in self.clients:
            client.close()
      print("Server stopped")# 打印服务器停止信息

莫谷 发表于 2023-12-11 09:50

在Python中,可以使用socket模块实现P2P(点对点)通信。下面是一个简单的示例,展示如何使用socket模块实现P2P通信:
[*]首先,我们需要创建两个Python程序,一个作为服务器端,另一个作为客户端。
服务器端(Server):import socket

# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
server_socket.bind(('127.0.0.1', 8000))

# 监听连接
server_socket.listen(1)
print('服务器已启动,等待客户端连接...')

# 等待客户端连接
client_socket, client_address = server_socket.accept()
print(f'客户端已连接:{client_address}')

# 向客户端发送消息
message = 'Hello, Client!'
client_socket.send(message.encode())

# 接收客户端发送的消息
client_message = client_socket.recv(1024).decode()
print(f'收到客户端的消息:{client_message}')

# 关闭连接
client_socket.close()
server_socket.close()
客户端(Client):import socket

# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接服务器,指定IP地址和端口号
client_socket.connect(('127.0.0.1', 8000))

# 从服务器接收消息
server_message = client_socket.recv(1024).decode()
print(f'收到服务器的消息:{server_message}')

# 向服务器发送消息
client_message = 'Hello, Server!'
client_socket.send(client_message.encode())

# 关闭连接
client_socket.close()
在这个示例中,服务器端程序会等待客户端连接,一旦有客户端连接,就会向客户端发送一条消息,然后等待客户端发送消息。客户端程序连接到服务器后,会接收服务器的消息,并向服务器发送一条消息。最后,两个程序都会关闭连接。

milu1123 发表于 2023-12-11 09:51

客户端代码



import socket                                 # 引入socket库,用于网络通信
import threading                           # 引入threading库,用于多线程处理

class Client:                               # 定义一个名为Client的类,该类用于实现客户端的功能
    def __init__(self, host='localhost', port=8000):   # 初始化方法,用于设置服务器地址和端口号,创建客户端socket对象
      self.host = host                        # 设置服务器地址和端口号
      self.port = port                        #   
      self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   # 创建客户端socket对象,使用TCP协议和IPv4地址
      self.client_socket.connect((self.host, self.port))   # 连接服务器
      self.running = True                     # 定义运行状态为True,表示客户端正在运行

    def handle_input(self):                   # 定义一个方法handle_input,用于处理用户输入和数据传输请求
      while True:                           # 循环处理用户输入,直到用户关闭客户端窗口或输入空字符串
            message = input("Enter message to send: ")   # 获取用户输入的消息
            if not message:                   # 如果用户输入空字符串或关闭客户端窗口,则跳出循环
                break
            self.client_socket.send(message.encode())   # 将用户输入的消息编码为字节串并发送给服务器
            data = self.client_socket.recv(1024)          # 接收服务器发送的数据,数据长度为1024字节
            print(f"Received from server: {data.decode()}")   # 打印从服务器接收到的数据,使用decode()方法将字节串解码为字符串
      self.client_socket.close()                     # 关闭客户端socket对象,释放资源
      self.running = False                            # 将运行状态设为False,表示客户端不再运行

    def start(self):                            # 定义一个方法start,用于启动客户端并处理用户输入和数据传输请求
      print(f"Client started on {self.host}:{self.port}")   # 打印客户端启动信息,包括服务器地址和端口号
      thread = threading.Thread(target=self.handle_input)   # 创建一个新线程,用于处理用户输入和数据传输请求
      thread.start()                        # 启动新线程
      while self.running:                   # 循环等待用户输入或关闭客户端窗口
            pass                              # 什么都不做,保持循环等待状态
      print("Client stopped")                # 打印客户端停止信息

5231824 发表于 2023-12-11 10:10

我承认我看成了 PP点点通复活了

可坏 发表于 2023-12-11 10:35

可以运行,可以的。

yyKin 发表于 2023-12-11 10:47

莫谷 发表于 2023-12-11 09:50
在Python中,可以使用socket模块实现P2P(点对点)通信。下面是一个简单的示例,展示如何使用socket模块实 ...

感谢大佬的回复,如果是四台主机之间的通信呢?要如何实现

ALin596 发表于 2023-12-11 10:56

这不是直接GPT生成,然后稍微改一改就好了

rwj1990 发表于 2023-12-11 12:06

考虑下nat穿越问题

坐久落花多 发表于 2023-12-11 12:42

我感觉公司用的RTX应该也是基于P2P的方式,服务器的压力很小,看起来很不错,不知道为啥腾讯放弃了后续的开发
页: [1] 2
查看完整版本: p2p点对点通信-python-socket