首页 > 解决方案 > Python socket accept() 不接受连接

问题描述

一个非常基本的问题,但我找不到我的错误。我基本上使用这个教程代码来实现我自己的客户端-服务器程序:客户端发送一些数据,服务器显示它(而不是像教程中那样回显数据)

回显教程代码有效,但我在服务器上打印数据的调整代码无效。我添加了一些分隔符机制来检测整个消息。我的代码:

服务器.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()

客户端.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

即使我没有启动服务器,这也会从客户端输出。奇怪的是,回声部分确实有效。有人可以提示我正确的方向吗?谢谢!

标签: pythonsocketstcp

解决方案


推荐阅读