【问题标题】:Python server get recv from all clients conncted and not just from the first one that connctedPython服务器从所有连接的客户端获取recv,而不仅仅是从第一个连接的客户端
【发布时间】:2021-03-22 16:31:47
【问题描述】:

标题说明一切。我编写了为 python 服务器发送消息的 Java 代码,但是每次只发送第一条消息,因为每次,java 都会再次连接到服务器,并且服务器一直等待来自我第一次发送的第一个客户端的下一条消息时间。

服务器如何从所有连接的客户端获取消息?而不仅仅是一个人?

我的python服务器:

    server = socket.socket()
    server.bind((socket.gethostname(), 4786))

    server.listen(5)
    (client, (ipNum, portNum)) = server.accept()

    print("Client connected")

    while True:
        message = str(client.recv(64).decode()) # Check if client send message. I want to change it to check all clients

        if(message != ""):
            print("Client: " + message)

        else:
            time.sleep(0.1)

【问题讨论】:

    标签: python sockets server client


    【解决方案1】:

    总结

    server.accept() 必须在循环内调用。

    TLDR

    从调用 socket.socket() 返回的套接字 server 是一个“监听”套接字。它不用于任何数据传输,而仅用于侦听传入连接。当服务器愿意接受传入连接时,然后调用server.accept()。此调用一直等到客户端连接。当客户端连接时,accept 唤醒并返回一个表示与一个客户端的连接的套接字。该套接字随后用于发送和接收数据,并应在与该特定客户端的通信完成时关闭。

    当服务器想要接受来自另一个客户端的连接时,它必须再次调用server.accept() 以等待来自另一个客户端的连接,并为每个连接的客户端使用唯一的客户端套接字。

    如果按顺序处理客户端就足够了,那么您可以将调用接受移到循环中。此外,您应该在与客户端的通信完成后关闭客户端套接字。

    如果可以并行连接多个客户端,则需要稍微复杂的设计。接受连接后,您可以为每个客户端启动一个新线程。线程可以循环调用recv,并在客户端断开连接时终止。例如,请参阅Multi Threaded TCP server in Python

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2019-02-28
      • 2018-12-30
      • 2016-07-06
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多