Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何作为服务器一次打开两个端口?_Python_Python 3.x_Sockets_Select - Fatal编程技术网

Python 如何作为服务器一次打开两个端口?

Python 如何作为服务器一次打开两个端口?,python,python-3.x,sockets,select,Python,Python 3.x,Sockets,Select,我对stackoverflow和socket编程非常陌生 我想一次打开两个服务器端口,并使用python3将它们用于不同的用途 我可以得到socketfd=3,但最终它变成了fd=-1和[关闭],为什么? 我在RaspberryPi操作系统和MacOS Big-Sur上尝试了这段代码。结果是一样的 请给我一些建议 [代码] 导入套接字 导入选择 端口=[808081] 套接字=[] 尝试: 对于端口中的端口: 地址=(“0.0.0.0”,端口) 将socket.socket(socket.AF_

我对stackoverflow和socket编程非常陌生

我想一次打开两个服务器端口,并使用python3将它们用于不同的用途

我可以得到socketfd=3,但最终它变成了fd=-1[关闭],为什么? 我在RaspberryPi操作系统和MacOS Big-Sur上尝试了这段代码。结果是一样的

请给我一些建议

[代码]

导入套接字
导入选择
端口=[808081]
套接字=[]
尝试:
对于端口中的端口:
地址=(“0.0.0.0”,端口)
将socket.socket(socket.AF_INET,socket.SOCK_STREAM)作为s:
s、 setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
s、 绑定(地址)
s、 听(1)
印刷品
sockets.append(s)
打印(“\n\n”,套接字)
尽管如此:
持续
除键盘中断外:
对于插座中的s:
s、 关闭()
结果

python3 socket_test.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 8080)>
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 8081)>

[<socket.socket [closed] fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>, <socket.socket [closed] fd=-1, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>]
python3 socket\u test.py
[, ]

with语句本身确保了资源的正确获取和释放。由于您是在
with
语句中获取套接字,当
with
块完成时,它会释放套接字。试试这个:

import socket
import select

PORTS = [8080, 8081]

sockets = []

try:
    for port in PORTS:
        addr = ("0.0.0.0", port)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(addr)
        s.listen(1)
        print(s)
        sockets.append(s)

   print("\n\n",sockets)

   while True:
       continue

except KeyboardInterrupt:
    for s in sockets:
        s.close()

with
语句本身确保了资源的正确获取和释放。由于您是在
with
语句中获取套接字,当
with
块完成时,它会释放套接字。试试这个:

import socket
import select

PORTS = [8080, 8081]

sockets = []

try:
    for port in PORTS:
        addr = ("0.0.0.0", port)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(addr)
        s.listen(1)
        print(s)
        sockets.append(s)

   print("\n\n",sockets)

   while True:
       continue

except KeyboardInterrupt:
    for s in sockets:
        s.close()

为什么要将
一起使用?您的意思是:
s=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
?感谢您指出代码。这就是问题所在。为什么要将
一起使用?您的意思是:
s=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
?感谢您指出代码。这就是问题所在。谢谢你的测试文件。解决了问题。”问题出在语句中。@Gerogero请标记为已接受的答案谢谢测试文件。解决了问题。”“问题出在”语句中。@Gerogero请标记为已接受的答案