本帖最后由 坨了的面条 于 2023-12-12 21:19 编辑
用python实现p2p点对点socket通信 附源码服务端代码 # 引入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") # 打印服务器停止信息
客户端代码 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") # 打印客户端停止信息
注:若转载请注明大神论坛来源(本贴地址)与作者信息。
|