服务器端和客户端之间进行简单的 TCP/IP 通信,并且服务器端使用多进程来处理数据接收和读取。

根据上一代代码进行修改:这个系统能允许服务器端和客户端之间进行简单的 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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值