почему нельзя подключить несколько клиентов к серверу одновременно?питон - PullRequest
0 голосов
/ 13 марта 2019

Допустим, у меня есть server.py и 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 Ответ

0 голосов
/ 13 марта 2019

В вашей функции 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...