Как я могу открыть два порта одновременно как серверы?

#python #python-3.x #sockets #select

#python #python-3.x #сокеты #выберите

Вопрос:

Я очень новичок в программировании stackoverflow и сокетов.

Я хотел бы открывать два порта сервера одновременно и использовать их для разных целей, используя python3.

Я мог бы получить сокет 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("nn",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>]
 

Комментарии:

1. Почему вы используете with ? Вы имели в виду: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ?

2. Спасибо, что указали на код. Это была проблема.

Ответ №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("nn",sockets)

   while True:
       continue

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

Комментарии:

1. Спасибо testfile. Проблема решена. проблема заключалась в «with statement».