首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >套接字和recv函数的问题。Python

套接字和recv函数的问题。Python
EN

Stack Overflow用户
提问于 2021-08-30 17:14:41
回答 1查看 42关注 0票数 0

,换句话说,在浏览器第一次响应之后,它就被卡住了。我刚开始使用socket编程,但是这里有一个愚蠢的问题,在发送来自服务器的响应之后,我是否需要关闭客户端套接字?在handleDataself.client.send()之后。或者这种行为的原因是什么?尝试在这里使用select使其异步,但没有帮助。同样的问题。在收到带有头的客户端的请求后,我进入循环的下一次迭代,完全到了recv(),并且它被卡住了。客户端不再发送信息,也不显示从服务器发送的信息。在本例中,它是"Info/Message检索的!“。

代码语言:javascript
运行
复制
P.S. DEFAULT_ENCODING = "utf-8"
DEFAULT_CLIENTS_AMOUNT = 5
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8080
代码语言:javascript
运行
复制
class Server:
    def __init__(self, socket_family: int = socket.AF_INET, socket_type: int = socket.SOCK_STREAM, ip_address: str = SERVER_IP, port: int = SERVER_PORT):
        self.addr: Tuple[str, int] = ip_address, port
        self.serv_heart: socket.socket = socket.socket(socket_family, socket_type)
        self.client: Optional[socket.socket] = None

    def _launchSyncServer(self, clients: int = DEFAULT_CLIENTS_AMOUNT):
        print("Starting server...")
        self.serv_heart.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        self.serv_heart.bind(self.addr)
        self.serv_heart.listen(clients)
        print(f"Server started at {str(self.addr)}")
        print(f"Visible: http://{self.addr[0]}:{self.addr[1]}")

    def _acceptConnections(self):
        client_socket, client_addr = self.serv_heart.accept()
        print(f"Client connected from {str(client_addr)}")
        self.client = client_socket

    def _handleData(self):
        while True:
            rawData: str = self.client.recv(128).decode(DEFAULT_ENCODING)
            if not rawData:
                self.client.close()
                break

            self.client.send("Info/Message was retrieved!".encode(DEFAULT_ENCODING))

        self.client.close()

    def serverLoop(self, clients: int = DEFAULT_CLIENTS_AMOUNT):
        self._launchSyncServer(clients=clients)
        while True:
          self._acceptConnections()
          self._handleData()
EN

回答 1

Stack Overflow用户

发布于 2021-09-02 09:53:51

--在浏览器第一次响应之后,它就被卡住了。

您的服务器不实现HTTP或任何其他浏览器协议,因此浏览器不是适合它的客户端;最好使用类似于nc localhost 8080的东西。

,我需要在发送来自服务器的响应后关闭客户端套接字吗?

这取决于你希望如何进行沟通。如果希望客户端只发送一条消息,则可以在响应后立即关闭服务器的连接。如果您希望客户端能够发送多条消息,服务器将为此做好准备,而客户机需要通过关闭其套接字或至少关闭写入来指示它已经完成。

请注意,通常情况下,您不能确定一个消息被单个recv调用完整地欺骗了--它可能会被拆分,并通过几次recv调用逐段返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68987962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档