почему несколько клиентов не могут быть подключены к серверу одновременно? Python

#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. Спасибо, я посмотрю документы и посмотрю, что я могу сделать, чтобы исправить это.