这个代码主要是,发送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()
接收端代码总结
-
功能概述
-
该代码负责在多个端口上监听并接收数据。
-
使用 multiprocessing.Queue 在多个进程间传递接收到的数据。
-
-
主要组件
-
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个字母)分割成多个数据块。
- 为每个端口分配数据块,并处理可能剩余的数据块(分配给额外端口)。
- 启动每个端口的数据发送进程。