Python socket accept () не принимает соединение - PullRequest
0 голосов
/ 05 мая 2020

Обычная c проблема, но я не могу найти свою ошибку. Я в основном использовал этот учебный код для реализации моей собственной клиент-серверной программы: клиент отправляет некоторые данные, сервер отображает их (вместо повторения данных, как в учебном пособии)

Повторяющийся учебный код работает, но мой скорректированный код для печати данных на сервере - нет. Я добавил какой-то механизм разделителя для обнаружения всего сообщения. Мой код:

Server.py:

class ThreadedServer:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.host, self.port))
        print("Server bound on Port "+str(port))

    def listen(self):
        self.sock.listen(5)
        while True:
            print("Waiting for incoming connections...")
            client, address = self.sock.accept()
            client.settimeout(60)
            print("Starting Working thread.")
            threading.Thread(target=self.listenToClientDelimiter, args=(client, address)).start()

    def listenToClientDelimiter(self, client, address):
        print("Connect to client "+address)
        length = None
        buffer = ""
        while True:
            data = client.recv(1024)
            print("Received raw data: "+str(data))
            if not data:
                break  # connection closed
            buffer += data
            while True:
                if length is None:
                    if LENGTH_DELIMITER not in buffer:
                        break  # delimiter not found, wait for next data package
                    length_str, _, buffer = buffer.partition(LENGTH_DELIMITER)
                    length = int(length_str)

                if len(buffer) < length:
                    break  # wait until full length got received before we proceed

                message = buffer[:length]
                buffer = buffer[length:]
                length = None
                # PROCESS MESSAGE HERE
                print(message)

        client.close()

if __name__ == "__main__":

    ThreadedServer('', 65432).listen()

Client.py:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(("127.0.0.1", 65432))

    connect_user_cmd = "18:CONNECT_USER;Peter"
    print("Trying to send data: "+connect_user_cmd.decode())
    print(s.send(connect_user_cmd))

Я запускаю сервер, затем клиент. Вывод с сервера:

Server bound on Port 65432
Waiting for incoming connections...

Как видите, я ожидаю несколько сообщений журнала и, конечно же, свое отправленное сообщение. Клиент выводит это:

Trying to send data: 18:CONNECT_USER;Peter
21

Process finished with exit code 0

Это выводится от клиента, даже когда я не запускаю сервер. Странно то, что эхо действительно работало. Может ли кто-нибудь намекнуть мне в правильном направлении? Спасибо!

...