在处理 HTTP 请求时,如果本地服务器在接收到完整的头部之前连接被关闭,通常是由于客户端发送的请求不完整或网络问题引起的。以下是一种可能的解决方法的示例代码:
import socket
def handle_request(client_socket):
request_data = b''
while b'\r\n\r\n' not in request_data:
try:
chunk = client_socket.recv(1024)
except socket.error as e:
print(f"Error receiving data: {str(e)}")
return
if not chunk:
print("Connection closed by client")
return
request_data += chunk
# 处理请求头部
headers, body = request_data.split(b'\r\n\r\n', 1)
# 进一步处理 body 或发送响应等操作
# 关闭客户端连接
client_socket.close()
def main():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('localhost', 8000))
server_socket.listen(5)
while True:
client_socket, addr = server_socket.accept()
handle_request(client_socket)
if __name__ == '__main__':
main()
在这个示例中,handle_request
函数用于处理客户端的请求。它会循环接收客户端发送的数据,直到接收到完整的头部(以 \r\n\r\n
结尾)。如果在接收过程中出现异常或客户端关闭连接,就会相应地处理并退出函数。处理完请求后,通过调用 client_socket.close()
关闭客户端连接。
在 main
函数中,创建服务器 socket 并监听端口。当有客户端连接时,接受连接,并将客户端 socket 传递给 handle_request
函数进行处理。
请注意,这只是一个简单的示例,实际情况可能需要更复杂的处理逻辑。