📌  相关文章
📜  跨两个不同端口的套接字 io (1)

📅  最后修改于: 2023-12-03 15:41:50.939000             🧑  作者: Mango

使用Python实现跨两个不同端口的套接字 IO

在网络编程中,我们经常需要同时处理多个连接。而有些情况下,我们需要在不同的端口上监听连接。本文将介绍如何使用Python实现一个跨两个不同端口的套接字IO,以便在不同的端口上监听多个连接。

1. 创建服务器

首先,我们需要创建一个服务器,它能够同时监听两个不同的端口。实现这一点的方法是在服务器的主循环中使用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)
2. 创建客户端

接下来,我们需要创建一个客户端,能够连接到我们的服务器。我们也可以使用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()}")
3. 运行代码

我们可以在一个终端窗口中启动服务器,并在另一个终端窗口中启动客户端。在客户端窗口中输入任何文本,都会被转发到两个不同的端口上,并显示在服务器终端窗口中。

$ 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