#实现HTTP客户端的程序 # coding: utf-8 import socket s = socket.socket() host = 'g.cn' port = 80 s.connect((host, port)) ip, port = s.getsockname() print("本机 ip 和 port {} {}".format(ip, port)) http_request = "GET / HTTP/1.1\r\nhost:{}\r\n\r\n".format(host) request = http_request.encode('utf-8') print('请求', request) s.send(request) response = s.recv(1023) print('响应', response) print('响应的 str 格式', response.decode('utf-8')) s.close()
以上程序中所用到的知识点如下:
- socket模块
#操作系统用来进行网络通信的底层方案
#即用来发送/接收数据
- 创建socket对象
用法: s = socket.socket()
- 服务器端socket函数 connect()
用法: s.connect(address)
#链接到address
#一般address的格式为tuple(host, port)
#链接出错,返回socket.error错误
- socket函数 getsockname()
用法:ip, port = s.getsockname()
#连接上后,可通过该函数得到本机的 ip 和端口
#返回值通常是tuple(ip, port)
- 元组的值赋给不同的变量
用法:
a, b = (1, 2)
print(a)
- 另一种格式化输出
用法:print("{} {}".format(变量1, 变量2))
#好处:不用判断变量的格式
- http请求格式
"GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n"
#目前该请求格式未包含body的请求
#GET 是请求的方法(POST也是一种)
# / 是请求的路径
# HTTP/1.1 是一种HTTP版本
# host 是请求主机域名
- str.encode('utf-8')
#编码:把 str 转换为 bytes,编码是 utf-8
str.decode('utf-8')
#解码:把 bytes 转换为 str,编码是 utf-8
#返回值即为转换结果
- socket函数 send()
用处:s.send(参数)
#发送 HTTP 请求(即参数内容)给服务器
# send 函数只接受 bytes 作为参数
- socket函数 recv()
用法:response = s.recv(1023)
#接受服务器的响应数据
#参数即为接收的最大数据量
#返回值即为相应数据,为bytes类型
- 客户端编程思想总结(socket)
创建套接字并链接至远端地址
s = socket.socket()
s.connect()
连接后发送数据和接收数据
s.send()
s.recv()
传输完毕后,关闭套接字
s.close