📅  最后修改于: 2023-12-03 15:41:50.939000             🧑  作者: Mango
在网络编程中,我们经常需要同时处理多个连接。而有些情况下,我们需要在不同的端口上监听连接。本文将介绍如何使用Python实现一个跨两个不同端口的套接字IO,以便在不同的端口上监听多个连接。
首先,我们需要创建一个服务器,它能够同时监听两个不同的端口。实现这一点的方法是在服务器的主循环中使用select()
函数。该函数允许我们检查多个套接字,并在任何一个套接字上发生事件时立即响应。
以下是一个示例服务器代码,它可以在8808和8809端口上监听连接。
import select
import socket
host = ''
port1 = 8808
port2 = 8809
# 创建套接字并绑定到端口
server_socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket1.bind((host, port1))
server_socket1.listen(5)
server_socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket2.bind((host, port2))
server_socket2.listen(5)
# 添加套接字到 select() 对象
inputs = [server_socket1, server_socket2]
while True:
# 使用 select() 函数检查套接字的事件
readable, writable, exceptional = select.select(inputs, [], [])
# 处理读事件
for s in readable:
# 如果是服务器套接字,则表示有新连接
if s in [server_socket1, server_socket2]:
client_socket, address = s.accept()
print(f"New connection from {address}")
inputs.append(client_socket)
# 否则,表示有新数据到达
else:
data = s.recv(1024)
if data:
print(f"Received: {data.decode('utf-8').strip()} from {s.getpeername()}")
else:
s.close()
inputs.remove(s)
接下来,我们需要创建一个客户端,能够连接到我们的服务器。我们也可以使用select()
函数来检查多个套接字,并读取用户的输入。
以下是一个示例客户端代码,它可以连接到我们的服务器,并发送消息到两个不同的端口。
import select
import socket
import sys
host = 'localhost'
port1 = 8808
port2 = 8809
# 创建套接字并连接到服务器
client_socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket1.connect((host, port1))
client_socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket2.connect((host, port2))
inputs = [client_socket1, client_socket2, sys.stdin]
while True:
# 使用 select() 函数检查套接字的事件
readable, writable, exceptional = select.select(inputs, [], [])
# 处理读事件
for s in readable:
if s is sys.stdin:
# 如果是用户输入,则发送到服务器
message = sys.stdin.readline()
client_socket1.sendall(message.encode('utf-8'))
client_socket2.sendall(message.encode('utf-8'))
else:
# 否则,表示有新数据到达
data = s.recv(1024)
print(f"Received: {data.decode('utf-8').strip()} from {s.getpeername()}")
我们可以在一个终端窗口中启动服务器,并在另一个终端窗口中启动客户端。在客户端窗口中输入任何文本,都会被转发到两个不同的端口上,并显示在服务器终端窗口中。
$ python server.py
New connection from ('127.0.0.1', 56355)
New connection from ('127.0.0.1', 56356)
Received: Hello from ('127.0.0.1', 56356)
Received: Hello from ('127.0.0.1', 56355)
$ python client.py
Hello