#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».