p2p点对点通信-python-socket
基于python的soket实现P2P点对点的通信。能点拨一下思路也行,跪求代码。{:1_889:} 服务端代码。。。。。# 引入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")# 打印服务器停止信息 在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()
在这个示例中,服务器端程序会等待客户端连接,一旦有客户端连接,就会向客户端发送一条消息,然后等待客户端发送消息。客户端程序连接到服务器后,会接收服务器的消息,并向服务器发送一条消息。最后,两个程序都会关闭连接。 客户端代码
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") # 打印客户端停止信息 我承认我看成了 PP点点通复活了 可以运行,可以的。 莫谷 发表于 2023-12-11 09:50
在Python中,可以使用socket模块实现P2P(点对点)通信。下面是一个简单的示例,展示如何使用socket模块实 ...
感谢大佬的回复,如果是四台主机之间的通信呢?要如何实现 这不是直接GPT生成,然后稍微改一改就好了 考虑下nat穿越问题 我感觉公司用的RTX应该也是基于P2P的方式,服务器的压力很小,看起来很不错,不知道为啥腾讯放弃了后续的开发
页:
[1]
2