#python-3.x #sockets
#python-3.x #сокеты
Вопрос:
Итак, допустим, у меня есть server.py и a client.py с помощью следующего кода:
server.py
import socket
def listen():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 5555
s.bind((host, port))
s.listen(128)
print("LISTENING FOR INCOMING CONNECTIONS")
c, addr = s.accept()
print("GOT CONNECTION FROM", addr)
while True:
data = c.recv(1024)
data = data.decode("utf-8")
data = data.upper()
c.send(data.encode("utf-8"))
listen()
и client.py
import socket
def connect():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 5555
s.connect((host, port))
print("CONNECTED TO HOST")
while True:
command = input("command> ")
s.send(command.encode("utf-8"))
data = s.recv(1024)
print(str(data.decode("utf-8")))
connect()
И теперь, если я отключу клиент и попытаюсь повторно подключиться к серверу, это не сработает. (и под «не будет работать» я подразумеваю, что соединение не будет установлено)
Ответ №1:
В вашей listen
функции в server.py
вы вызываете accept
функцию только один раз. accept
должен вызываться для каждого клиентского подключения, которое вы хотите принять. Чтобы решить вашу проблему, вы можете просто поместить последнюю часть функции в цикл:
def listen():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 5555
s.bind((host, port))
s.listen(128)
while True:
print("Waiting for an incoming connection...")
c, addr = s.accept()
print("GOT CONNECTION FROM", addr)
# Serve the connection
try:
while True:
data = c.recv(1024)
if len(data) == 0:
print("Client closed connection")
break
data = data.decode("utf-8")
data = data.upper()
c.send(data.encode("utf-8"))
except Exception as e:
print("Connection died: {}".format(e))
Это будет означать, что одновременно может быть подключен только 1 клиент.
Вместо того, чтобы писать этот тип кода самостоятельно, я бы настоятельно рекомендовал взглянуть на SocketServer в стандартной библиотеке Python. Эта библиотека выполняет стандартные процедуры прослушивания / приема, а также обладает некоторыми расширенными функциями, которые позволяют вам легко обрабатывать более одного клиентского подключения одновременно (если вам это нужно)
https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example
Комментарии:
1. Спасибо, я посмотрю документы и посмотрю, что я могу сделать, чтобы исправить это.