#coding=utf-8
import socket
import re
def handle_client(client_socket):
"为一个客户端进行服务"
recv_data = client_socket.recv(1024).decode('utf-8', errors="ignore")
request_header_lines = recv_data.splitlines()
for line in request_header_lines:
print(line)
http_request_line = request_header_lines[0]
get_file_name = re.match("[^/]+(/[^ ]*)", http_request_line).group(1)
print("file name is ===>%s" % get_file_name) # for test
# 如果没有指定访问哪个页面。例如index.html
# GET / HTTP/1.1
if get_file_name == "/":
get_file_name = DOCUMENTS_ROOT + "/index.html"
else:
get_file_name = DOCUMENTS_ROOT + get_file_name
print("file name is ===2>%s" % get_file_name) #for test
try:
f = open(get_file_name, "rb")
except IOError:
# 404表示没有这个页面
response_headers = "HTTP/1.1 404 not found\r\n"
response_headers += "\r\n"
response_body = "====sorry ,file not found===="
else:
response_headers = "HTTP/1.1 200 OK\r\n"
response_headers += "\r\n"
response_body = f.read()
f.close()
finally:
# 因为头信息在组织的时候,是按照字符串组织的,不能与以二进制打开文件读取的数据合并,因此分开发送
# 先发送response的头信息
client_socket.send(response_headers.encode('utf-8'))
# 再发送body
client_socket.send(response_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(("", 7788))
server_socket.listen(128)
while True:
client_socket, clien_cAddr = server_socket.accept()
handle_client(client_socket)
#这里配置服务器
DOCUMENTS_ROOT = "./html"
if __name__ == "__main__":
main()response header 和response body出错
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注你的代码中存在一些问题,主要涉及到处理二进制文件和字符串拼接的地方。以下是一些修改建议:
读取二进制文件内容: 由于你是以二进制方式打开文件,读取文件内容时也应该以二进制方式进行,避免出现编码问题。
使用
b模式打开文件: 打开文件时,建议使用二进制模式('rb'),以确保读取文件内容时不会发生编码问题。发送二进制数据: 在发送响应体时,需要将二进制数据编码为字节流发送。
下面是修改后的代码片段:
# ... try: f = open(get_file_name, "rb") except IOError: # 404表示没有这个页面 response_headers = "HTTP/1.1 404 not found\r\n" response_headers += "\r\n" response_body = "====sorry ,file not found====".encode('utf-8') else: response_headers = "HTTP/1.1 200 OK\r\n" response_headers += "\r\n" response_body = f.read() f.close() # ... # 先发送response的头信息 client_socket.send(response_headers.encode('utf-8')) # 再发送body client_socket.send(response_body) client_socket.close()在上述代码中,
response_body使用encode('utf-8')进行编码,以确保它是一个字节流而不是字符串。另外,在读取文件内容时,也需要将其以二进制方式读取。这样就能够正确处理二进制文件并向客户端发送正确的响应。解决 无用评论 打赏 举报