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

这个代码主要是,发送26个字母,通过本地的IP地址设置不同的端口,每个端口发送5个字母,并且端口一直发送,在接受端,通过一个队列接受端口发送来的字母,进行读取。

总结:
接收端: 设置了多个端口的监听和数据接收,同时使用队列传递数据,确保所有端口的数据都被正确接收和处理。
发送端: 将字母数据分配到不同的端口,使用多个进程进行数据发送,每个进程连接到一个指定的端口。

接收端代码

import socket
import time
from multiprocessing import Process

def send_data(server_ip, server_port, data):
    try:
        # 创建socket对象
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 连接到服务器
        s.connect((server_ip, server_port))

        while True:
            for chunk in data:
                print(f"发送: {chunk} 到端口: {server_port}")
                s.send(chunk.encode('utf-8'))
                time.sleep(1)  # 模拟发送间隔

    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())
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    chunk_size = 5
    ports = [12345 + i for i in range(5)]

    # 分配字母到端口
    port_data_map = {}
    num_ports = len(ports)
    num_chunks = (len(alphabet) + chunk_size - 1) // chunk_size  # 计算需要的总块数

    for i, port in enumerate(ports):
        start_index = i * chunk_size
        end_index = start_index + chunk_size
        # 只处理到最后一个块
        if end_index > len(alphabet):
            end_index = len(alphabet)
        port_data_map[port] = [alphabet[start_index:end_index]]

    # 如果有剩余的字母,分配给一个额外的端口
    if end_index < len(alphabet):
        extra_port = ports[-1] + 1
        extra_data = [alphabet[end_index:]]
        port_data_map[extra_port] = extra_data

    print(port_data_map)

    # 启动每个发送进程
    senders = [Process(target=send_data, args=(server_ip, port, data)) for port, data in port_data_map.items()]

    for sender in senders:
        sender.start()

    for sender in senders:
        sender.join()

接收端代码总结

  1. 功能概述

    • 该代码负责在多个端口上监听并接收数据。

    • 使用 multiprocessing.Queue 在多个进程间传递接收到的数据。

  2. 主要组件

  • receive_data(q, port) 函数:

    • 创建一个 TCP socket 并绑定到指定端口。
    • 监听连接请求,并接受来自客户端的数据。
    • 将接收到的数据存入队列 q,数据存入队列时包含端口信息。
    • 使用 None 标记数据接收结束,以便 read_data 函数可以结束。
  • read_data(q) 函数:

    • 从队列中读取数据,并打印到控制台。
    • 通过 received_ports 集合跟踪哪些端口的数据已被接收。
    • 如果所有端口的数据都已接收,则退出循环。
  • main 部分:

    • 创建接收端进程并启动,监听指定的端口(包括一个额外的端口)。
      - 启动一个单独的进程来读取和打印数据。

发送端代码

import socket
import time
from multiprocessing import Process


def send_data(server_ip, server_port, data):
    try:
        # 创建socket对象
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 连接到服务器
        s.connect((server_ip, server_port))

        while True:
            for chunk in data:
                print(f"发送: {chunk} 到端口: {server_port}")
                s.send(chunk.encode('utf-8'))
                time.sleep(1)  # 模拟发送间隔

    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())
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    chunk_size = 5
    ports = [12345 + i for i in range(5)]

    # 分配字母到端口
    port_data_map = {}
    num_ports = len(ports)
    num_chunks = (len(alphabet) + chunk_size - 1) // chunk_size  # 计算需要的总块数

    for i, port in enumerate(ports):
        start_index = i * chunk_size
        end_index = min(start_index + chunk_size, len(alphabet))
        # 如果是最后一个端口,确保接收所有剩余的字母
        if i == num_ports - 1:
            end_index = len(alphabet)
        port_data_map[port] = [alphabet[start_index:end_index]]

    print(port_data_map)
    # 启动每个发送进程
    senders = [Process(target=send_data, args=(server_ip, port, data)) for port, data in port_data_map.items()]

    for sender in senders:
        sender.start()

    for sender in senders:
        sender.join()

发送端代码总结
1.功能概述

  • 该代码负责将字母数。据块发送到不同的端口。
  • 每个端口对应一个独立的发送进程。

2.主要组件

  • send_data(server_ip, server_port, data) 函数:
    • 创建一个 TCP socket 并连接到指定的服务器端口。
    • 发送数据块到服务器,并模拟发送间隔。
    • 捕获并处理可能的连接错误。
  • main 部分:
    • 将字母 ‘abcdefghijklmnopqrstuvwxyz’ 按指定大小(5个字母)分割成多个数据块。
    • 为每个端口分配数据块,并处理可能剩余的数据块(分配给额外端口)。
    • 启动每个端口的数据发送进程。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值