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

2024-09-27 07:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我对stackoverflow和socket编程非常陌生

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

我可以得到socketfd=3,但最终它变成了fd=-1[关闭],为什么? 我在RaspberryPi操作系统和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>]

Tags: 代码importstreamtypesocketfamilysocketspython3
1条回答
网友
1楼 · 发布于 2024-09-27 07:22:15

{}语句本身确保了资源的正确获取和释放。因为您是在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()

相关问题 更多 >

    热门问题