【问题标题】:How can I open two ports at a time as servers?如何一次打开两个端口作为服务器?
【发布时间】:2021-05-13 22:18:34
【问题描述】:

我对 stackoverflow 和套接字编程非常陌生。

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

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

请给我建议。

[代码]

import socket
import select

PORTS = [8080, 8081]

sockets = []

try:
  for port in PORTS:
    addr = ("0.0.0.0", port)
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
      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()

结果

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>]

【问题讨论】:

  • 你为什么使用with?您的意思是:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • 感谢您指出代码。这就是问题所在。

标签: python python-3.x sockets select


【解决方案1】:

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 statement' 是问题所在。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2021-06-22
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多