所以换句话说,它只是在浏览器的第一个响应之后卡住了。我是新的套接字编程,但这里是愚蠢的问题,我需要在服务器发送响应后关闭客户端套接字?在
self.client.send()
之后是handleData
。或者是什么原因这种行为?尝试在这里使用select使其异步但这无济于事。相同的问题。在我得到客户的要求之后有了头,我就进入循环的下一次迭代,准确地说是recv()
被卡住了。客户端不再发送信息不显示从服务器发送的信息。在这个例子中是"信息/消息已检索到!">
P.S. DEFAULT_ENCODING = "utf-8"
DEFAULT_CLIENTS_AMOUNT = 5
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8080
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()
它只是在浏览器的第一个响应后卡住了。
你的服务器没有实现HTTP或任何其他浏览器协议,所以浏览器不是一个合适的客户端;最好使用nc localhost 8080
之类的。
我需要在服务器发送响应后关闭客户端套接字吗?
这取决于您希望如何进行通信。如果希望客户机只发送一条消息,则可以在响应后立即关闭服务器的连接。如果您希望客户端能够发送多条消息,则服务器已经为此做好了准备,并且客户端需要通过关闭其套接字或至少关闭写入来指示它已经完成。
请注意,通常情况下,您不能确保通过单个recv
调用就完整地接收到消息——它可能会通过多次调用recv
而被分割并一块一块地返回。