python - 如何使服务器接受来自多个端口的连接?

标签 python network-programming

我怎样才能让一个简单的服务器(简单到接受连接并打印到终端接收到的任何东西)接受来自多个端口或端口范围的连接?

我是否必须使用多个线程,一个用于每个绑定(bind)调用。或者有其他解决方案吗?

简单的服务器看起来像这样。

def server():
import sys, os, socket

port = 11116
host = ''
backlog = 5 # Number of clients on wait.
buf_size = 1024

try:
    listening_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    listening_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
    listening_socket.bind((host, port)) 
    listening_socket.listen(backlog)
except socket.error, (value, message):
    if listening_socket:
        listening_socket.close()
    print 'Could not open socket: ' + message
    sys.exit(1)

while True:
    accepted_socket, adress = listening_socket.accept()

    data = accepted_socket.recv(buf_size)
    if data:
        accepted_socket.send('Hello, and goodbye.')
    accepted_socket.close()

server()

编辑: 这是如何完成的示例。谢谢大家。

import socket, select

def server():
import sys, os, socket

port_wan = 11111
port_mob = 11112
port_sat = 11113

sock_lst = []
host = ''
backlog = 5 # Number of clients on wait.
buf_size = 1024

try:
    for item in port_wan, port_mob, port_sat:
        sock_lst.append(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
        sock_lst[-1].setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
        sock_lst[-1].bind((host, item)) 
        sock_lst[-1].listen(backlog)
except socket.error, (value, message):
    if sock_lst[-1]:
        sock_lst[-1].close()
        sock_lst = sock_lst[:-1]
    print 'Could not open socket: ' + message
    sys.exit(1)

while True:
    read, write, error = select.select(sock_lst,[],[])

    for r in read:
        for item in sock_lst:
            if r == item:
                accepted_socket, adress = item.accept()

                print 'We have a connection with ', adress
                data = accepted_socket.recv(buf_size)
                if data:
                    print data
                    accepted_socket.send('Hello, and goodbye.')
                accepted_socket.close()

server()

最佳答案

我不是 python 专家,但您感兴趣的功能是“select”。这将允许您观察多个套接字,并在其中任何一个套接字发生事件时中断。

这是一个 python example that uses select .

关于python - 如何使服务器接受来自多个端口的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232366/

相关文章:

Python Gunicorn Worker 由于参数不正确而退出?

sockets - TCP 套接字中的 IP 地址

Python SocketServer 从服务器发送消息

c# - 是否可以在不使用 WMI 的情况下获取网络适配器的 PnPDeviceId?

java - 如何在聊天室程序中实现不断更新的用户列表?

python - pandas.DataFrame.update 中不需要的类型转换

Python 'requests' 模块和编码?

c - 服务器客户端程序未定义行为

python - 使用 Django Channels 意外收到 WebSocket 断开连接

Python UTF-8 转换