1.http协议基于tcp,有连接可靠传输
2.http请求报文:
GET / HTTP/1.1Host: 192.168.57.131:8800Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9
a.Get / HTTP/1.1:第一个/表示浏览器请求什么页面。平时输入,表示访问一个主页,如果输入 /a/b/c.html.这句就变成Get /a/b/c.html HTTP/1.1
b.Connection:分为长短连接
c.user-agent:客户端浏览器版本
d.accept:表示浏览器可以接受什么格式的数据
e.accept-encoding:如果服务器发送数据较大,采用什么格式压缩数据
3.服务器代码
import socketdef server(t_sock):# 循环:为一个客户多次服务while True:# 从客户端接收http请求recv_data = t_sock.recv(1024)print(recv_data.decode("gbk"))# 给客户端发送http应答,在网页上显示‘你好’# http可能面对不同的os,所以约定用\r\n来表示换行# http的header和body区分之处:只要出现第一个空行,二者便区分开send_data = "HTTP/1.1 200 OK\r\n\r\n<h1>你好</h1>"t_sock.send(send_data.encode("gbk"))def main():# 创建tcp套接字tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置当服务器先调用close,即服务器四次挥手后能将资源立即释放,这样就保证了下次运行程序时能# 立即连接tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定ip,端口tcp_sock.bind(('', 54321))# 改为监听套接字tcp_sock.listen(128)# 循环:可以为多个客户服务while True:# 使用accept等待客户连接,此时程序阻塞# 客户连接后返回两个值,服务套接字和客户端地址client_sock, client_add = tcp_sock.accept()# 为客户服务,用一个方法来实现,注意参数server(client_sock)# 关闭服务套接字client_sock.close()# 关闭监听套接字tcp_sock.close()if __name__ == "__main__":main()