Python 如何作为服务器一次打开两个端口?
我对stackoverflow和socket编程非常陌生 我想一次打开两个服务器端口,并使用python3将它们用于不同的用途 我可以得到socketfd=3,但最终它变成了fd=-1和[关闭],为什么? 我在RaspberryPi操作系统和MacOS Big-Sur上尝试了这段代码。结果是一样的 请给我一些建议 [代码]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_
导入套接字
导入选择
端口=[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请标记为已接受的答案