,换句话说,在浏览器第一次响应之后,它就被卡住了。我刚开始使用socket编程,但是这里有一个愚蠢的问题,在发送来自服务器的响应之后,我是否需要关闭客户端套接字?在
handleData的self.client.send()之后。或者这种行为的原因是什么?尝试在这里使用select使其异步,但没有帮助。同样的问题。在收到带有头的客户端的请求后,我进入循环的下一次迭代,完全到了recv(),并且它被卡住了。客户端不再发送信息,也不显示从服务器发送的信息。在本例中,它是"Info/Message检索的!“。
P.S. DEFAULT_ENCODING = "utf-8"
DEFAULT_CLIENTS_AMOUNT = 5
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8080class 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()发布于 2021-09-02 09:53:51
--在浏览器第一次响应之后,它就被卡住了。
您的服务器不实现HTTP或任何其他浏览器协议,因此浏览器不是适合它的客户端;最好使用类似于nc localhost 8080的东西。
,我需要在发送来自服务器的响应后关闭客户端套接字吗?
这取决于你希望如何进行沟通。如果希望客户端只发送一条消息,则可以在响应后立即关闭服务器的连接。如果您希望客户端能够发送多条消息,服务器将为此做好准备,而客户机需要通过关闭其套接字或至少关闭写入来指示它已经完成。
请注意,通常情况下,您不能确定一个消息被单个recv调用完整地欺骗了--它可能会被拆分,并通过几次recv调用逐段返回。
https://stackoverflow.com/questions/68987962
复制相似问题