Python Socket发送html在Safari上render的常见问题

Python Socket发送html在Safari上render的常见问题

  • Python代码
  • 遇到的问题
  • 更多

Python代码

写了两个版本的方法,第一个是同目录下无条件的简单html发送,第二个是根据client的request截取需要文件,进行发送。

代码如下:

# coding=utf-8
from socket import *
import re


def handle_client(client_socket):
    """为一个客户端服务"""
    # 接收对方发送的数据
    recv_data = client_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数
    # 打印从客户端发送过来的数据内容
    print("client_recv:", recv_data)
    request_header_lines = recv_data.splitlines()
    for line in request_header_lines:
        print(line)
    # 返回浏览器数据
    # 设置返回的头信息 header
    response_headers = "HTTP/1.1 200 OK\r\n\r\n"  # 200 表示找到这个资源
    # 设置内容body
    file_name = 'index.html'
    f = open(file_name, 'rb')
    response_body = f.read()
    f.close()

    # 返回数据给浏览器
    client_socket.send(response_headers.encode("utf-8"))  # 转码utf-8并send数据到浏览器
    client_socket.send(response_body)
    client_socket.close()


def handle_client2(client_socket):
    """为一个客户端服务"""
    # 接收对方发送的数据
    recv_data = client_socket.recv(1024).decode("utf-8")  # 1024表示本次接收的最大字节数
    # 打印从客户端发送过来的数据内容
    print("client_recv:", recv_data)
    request_header_lines = recv_data.splitlines()
    for line in request_header_lines:
        print(line)
    # 返回浏览器数据
    # 解析request
    ret = re.match(r"[^/]+(/[^ ]*)", request_header_lines[0])
    if ret:
        file_name = ret.group(1)
        if file_name == "/":
            file_name = "/index.html"
    # 设置内容body
    f = open(ROOT_DIR + file_name, 'rb') # ROOT_DIR需自己定义
    response_body = f.read()
    f.close()
     # 设置返回的头信息 header
    response_line = "HTTP/1.1 200 OK\r\n"
    # Content-Type: text/html;charset=utf-8 服务器告诉浏览器数据的类型及编码格式
    response_header = "Server:PWS/1.1\\nother:ok\r\nContent-Type:text/html;charset=utf-8\r\n"
    # 组装http响应报文数据
    response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
    # 返回数据给浏览器
    client_socket.sendall(response_data)
    client_socket.close()



def main():

   # 创建套接字
    server_socket = socket(AF_INET, SOCK_STREAM)
   # 设置当服务器先close 即服务器端4次挥手之后资源能够立即释放,这样就保证了,下次运行程序时 可以立即绑定7788端口
    server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
   # 设置服务端提供服务的端口号
    server_socket.bind(('', 8008))
   # 使用socket创建的套接字默认的属性是主动的,使用listen将其改为被动,用来监听连接
    server_socket.listen(128)  # 最多可以监听128个连接
   # 开启while循环处理访问过来的请求
    while True:
          # 如果有新的客户端来链接服务端,那么就产生一个新的套接字专门为这个客户端服务
      # client_socket用来为这个客户端服务
      # server_socket就可以省下来专门等待其他新的客户端连接while True:
      client_socket, clientAddr = server_socket.accept()
      handle_client(client_socket)


if __name__ == "__main__":
   main()

遇到的问题

  1. 发送的简单html(如下)在chrome可以正常render,在safari却以text形式出现。
    	

    Hello World!

    解决方法:
    查看safari的页面源代码发现safari没有意识到这是一个html文件,自己又二次加工了一个,所以在html文件把tag写全就可以了。
    	

    Hello World!

  2. 发送复杂html的时候safari和chrome都会当成text处理。
    解决方法:
    在python代码的header中使用Content-Type特别规定文件的格式。
    	response_header = "Content-Type:text/html;charset=utf-8\r\n"
    

更多

Python的socket库只适合做一些简单的信息传递。建立文件访问服务器选择Apache,Nginx,Python库SimpleHTTPServer等会轻松很多。

Python Socket发送html在Safari上render的常见问题_第1张图片

你可能感兴趣的:(python,html,服务器,socket,websocket)