根据上一代代码进行修改:这个系统能允许服务器端和客户端之间进行简单的 TCP/IP 通信,并且服务器端使用多进程来处理数据接收和读取。
修改是两个代码模块之间的关系是发送端负责发送数据,并且能够通过多个端口进行发送,接收端负责在指定端口上监听并接收这些数据。每个端口都可以独立工作,处理自己的连接和数据流。
发送数据的代码
这段代码负责通过多个端口向接收端发送数据,每个端口发送一串字母数据。
import socket
import time
from multiprocessing import Process
def send_data(server_ip, server_port):
try:
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
s.connect((server_ip, server_port))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
chunk_size = 5
while True:
for i in range(0, len(alphabet), chunk_size):
chunk = alphabet[i:i + chunk_size]
print(f"发送: {chunk} 到端口: {server_port}")
s.send(chunk.encode('utf-8'))
time.sleep(1) # 模拟发送间隔
s.close()
except ConnectionAbortedError as e:
print(f"连接中断错误: {e}")
except ConnectionRefusedError as e:
print(f"连接被拒绝错误: {e}")
except Exception as e:
print(f"发生了其他错误: {e}")
finally:
s.close()
if __name__ == '__main__':
server_ip = socket.gethostbyname(socket.gethostname())
ports = [12345 + i for i in range(5)]
senders = [Process(target=send_data, args=(server_ip, port)) for port in ports]
for sender in senders:
sender.start()
for sender in senders:
sender.join()
工作流程:
1.send_data函数:
- 创建一个TCP socket并连接到服务器的指定端口。
- 按照5个字符为一个块的方式逐个发送字母表数据。
- 每个块发送完后等待1秒钟。
2.主程序:
- 获取服务器IP地址,并为多个端口创建发送进程。
- 每个进程对应一个端口,并通过该端口发送数据。
接收数据的代码
这段代码负责在多个端口上监听连接,并将接收到的数据存入队列中,然后由另一个进程从队列中读取数据并处理。
import time
from multiprocessing import Queue, Process
import socket
def receive_data(q, port):
try:
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本机IP地址
ip = socket.gethostbyname(socket.gethostname())
# 绑定IP地址和端口
s.bind((ip, port))
# 开始监听
s.listen()
print(f"等待连接... 端口: {port}")
while True:
# 接受连接
conn, addr = s.accept()
print(f"连接成功!地址: {addr} 端口: {port}")
# 接收数据
while True:
chunk = conn.recv(1024).decode()
if not chunk:
break
q.put((port, chunk)) # 存入队列时包含端口信息
q.put((port, None)) # 使用 None 作为数据接收结束的标志
conn.close()
except Exception as e:
print(f"接收端错误 (端口 {port}): {e}")
def read_data(q):
print("开始读取数据...")
while True:
port, data = q.get()
if data is None:
# 数据接收完成
break
print(f"读取到数据 (端口 {port}):{data}")
time.sleep(1)
if __name__ == '__main__':
q = Queue()
ports = [12345 + i for i in range(5)]
receivers = [Process(target=receive_data, args=(q, port)) for port in ports]
qr = Process(target=read_data, args=(q,))
for receiver in receivers:
receiver.start()
qr.start()
for receiver in receivers:
receiver.join()
qr.join() # 确保读取进程在接收进程完成后再退出
工作流程:
1. receive_data函数:
- 在指定端口上创建一个TCP socket并绑定。
- 监听来自客户端的连接请求。
- 接收客户端发送的数据,将其与对应端口号一起存入队列中。
- 通过队列将数据传递给read_data函数进行处理。
2. read_data函数:
- 从队列中读取数据。
- 打印出接收到的数据以及相应的端口号。
3. 主程序::
- 创建了一个队列和多个进程,每个进程负责一个端口的监听。
- 最后一个进程负责从队列中读取数据。
用途:
1.发送端和接收端的代码可以用于构建一个基本的分布式系统,其中发送端和接收端之间通过网络进行通信。
2.可以用来测试和验证网络连接、数据传输的可靠性和性能,尤其是在需要多端口、多进程的环境中进行测试时。
3.可以扩展到负载均衡的场景,其中多个发送端连接到多个接收端以均衡负载。
4.用于实时处理数据流的场景,例如传感器数据的收集和处理。
https://blog.csdn.net/weixin_45734021/article/details/141000948?spm=1001.2014.3001.5501