Почему мой сервер Python не может обрабатывать данные от нескольких клиентов одновременно с помощью select.select ()? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь создать сервер, который будет получать и распаковывать объекты структуры от нескольких клиентов одновременно в Python. Программа работает, когда к серверу подключен только 1 клиент, но выдает ошибку struct.error, когда подключено более 1 клиента.

Это как если бы 2 клиента отправляли свои данные как один, создавая таким образомобъект неправильного размера для struct.unpack ().

Код сервера:

def handleConnections(self):
         while self.inputs:
            try:
                readable, writeable, exceptional = select.select(self.inputs, self.outputs, self.inputs, self.timeout)

                if not (readable or writeable or exceptional):
                    continue

                self.handleInputs(readable, writeable)
            except KeyboardInterrupt:
                print("Never liked you anyway")
                sys.exit()

def handleInputs(self, readable, writeable):
        for sock in readable:
            if sock is self.server:
                self.handleNewConnection(sock)
            else:
                self.handleQuestionFromClient(sock, writeable)

def handleQuestionFromClient(self, client, writeable):
        question = client.recv(1024)

        self.respondToClient(question, writeable)

def respondToClient(self, question, writeable):
        question = struct.unpack("ci", question)
        print("recieved question: ", question)
        # Do more stuff

Я бы ожидал, что каждый клиент независимо отправит эти объекты структуры на сервер, и ввключите сервер для самостоятельной распаковки и работы с ними. Однако, когда есть 2 или более клиентов, я получаю этот struct.error, в результате которого метод struct.unpack () получает аргумент неправильного размера.

Traceback (most recent call last):
  File "C:\Users\Dell\Bonus\2019.osz_Telekommunikacios_halozatok\barkoba\server.py", line 104, in <module>
    barkobaServer.handleConnections()
  File "C:\Users\Dell\Bonus\2019.osz_Telekommunikacios_halozatok\barkoba\server.py", line 95, in handleConnections
    self.handleInputs(readable, writeable)
  File "C:\Users\Dell\Bonus\2019.osz_Telekommunikacios_halozatok\barkoba\server.py", line 33, in handleInputs
    self.handleQuestionFromClient(sock, writeable)
  File "C:\Users\Dell\Bonus\2019.osz_Telekommunikacios_halozatok\barkoba\server.py", line 83, in handleQuestionFromClient
    self.respondToClient(question, writeable)
  File "C:\Users\Dell\Bonus\2019.osz_Telekommunikacios_halozatok\barkoba\server.py", line 44, in respondToClient
    question = struct.unpack("ci", question)
struct.error: unpack requires a buffer of 8 bytes

Я не могу понять, почемуэтот код работает для одного клиента, но завершается ошибкой, когда два или более клиентов подключены одновременно.

(я не уверен, достаточно ли предоставленного мной кода, это мой первый вопрос по StackOverflow)

1 Ответ

0 голосов
/ 03 ноября 2019

Вы выполняете

    question = client.recv(1024)

и затем предполагаете, что прибыло восемь байтов, что вы можете unpack().

Немного отладки вскоре покажет, что черездва ваших соединения, одно получает один или несколько байтов, а другое получает ноль байтов.

Распаковка нулевых байтов вас огорчает. Тест на длину менее восьми.

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