大神论坛

找回密码
快速注册
查看: 206 | 回复: 0

[源码] 用python实现p2p点对点socket通信 附源码

主题

帖子

0

积分

初入江湖

UID
662
积分
0
精华
威望
0 点
违规
大神币
68 枚
注册时间
2023-10-14 10:47
发表于 2023-12-12 21:19
本帖最后由 坨了的面条 于 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") # 打印客户端停止信息


注:若转载请注明大神论坛来源(本贴地址)与作者信息。

返回顶部