吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 647|回复: 10
收起左侧

[求助] p2p点对点通信-python-socket

[复制链接]
yyKin 发表于 2023-12-11 09:37
基于python的soket实现P2P点对点的通信。能点拨一下思路也行,跪求代码。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

milu1123 发表于 2023-12-11 09:48
服务端代码。。。。。


[Asm] 纯文本查看 复制代码
# 引入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):
[Asm] 纯文本查看 复制代码
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):
[Asm] 纯文本查看 复制代码
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
客户端代码



[Asm] 纯文本查看 复制代码
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的方式,服务器的压力很小,看起来很不错,不知道为啥腾讯放弃了后续的开发
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 06:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表