1.模拟浏览器
"""
1. 导入模块
2. 创捷套接字
3. 建立连接
4. 拼接请求协议
5. 发送请求协议
6. 接收服务器响应内容
7. 保存内容
8. 关闭连接
"""
# 1. 导入模块
import socket
# 2. 创捷套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3. 建立连接
tcp_client.connect(("www.baidu.com", 80)) # web默认端口
# 4.拼接请求协议
# 请求协议:
# 1)请求行
request_line = 'GET / HTTP/1.1\r\n'
# 2)请求头
request_header = 'HOST :www.baidu.com\r\n'
# 3)请求空行
request_black = '\r\n'
# 整体拼接
request_data = request_line + request_header + request_black
# 5. 发送请求协议
# 请求报文默认字符串,需要编码成二进制
tcp_client.send(request_data.encode())
# 6.接收服务器响应内容
recv_data = tcp_client.recv(4096) # 4096= KB
print(recv_data)
# 解码接收到的二进制数据
recv_text = recv_data.decode('')
print(recv_text)
# 7. 保存内容
# 查询位置\r\n\r\n
locations = recv_text.find('\r\n\r\n')
# 截取
loc_data = recv_text[locations:]
# 保存内容到文件
with open('index.html', 'w') as file:
file.write(loc_data)
# 8. 关闭连接
tcp_client.close()
输出结果为接受到从百度服务器返回的响应报文
简单的web服务器
"""
TCP服务端
1.导入模块
2.创建套机字
3.绑定端口
4.设置地址重用
5.设置监听,主动边被动
6.接受客户端连接 定义函数
7.接受客户端发送的请求报文
8.判断协议是否为空
9.拼接响应的报文
10.发送响应报文
11.关闭套接字
"""
def request_handler(new_client_socket, ip_port):
"""
接受信息并作出响应
:return:
"""
# 7.接受客户端发送的请求报文
# 8.判断协议是否为空
request_data = new_client_socket.recv(1024)
# print(request_data)
if not request_data:
print('%s客户端已经下线!' % str(ip_port))
new_client_socket.close()
return
# 9.拼接响应的报文
# 相应行
response_line = 'HTTP/1.1 200 OK\r\n'
# 响应头
response__header = 'Server:Python20WS/2.1\r\n'
# 响应空行
response_blank = '\r\n'
# 响应主体
response__body = 'HelloWorld!'
# 连接成一个主体
response__data = response_line + response__header + response_blank + response__body
# 10.发送响应报文
new_client_socket.send(response__data.encode())
# 关闭当前连接
new_client_socket.close()
def main():
# 1.导入模块
import socket
# 2.创建套机字
tcp_service_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3.设置地址重用
# SOL_SOCKET:当前套接字,SO_REUSEADDR:地址重用
tcp_service_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 4.绑定端口
tcp_service_socket.bind(('', 8080))
# 5.设置监听,主动边被动
tcp_service_socket.listen(128)
# 6.接受客户端连接定义函数
while True:
new_client_socket, ip_port = tcp_service_socket.accept()
request_handler(new_client_socket, ip_port)
# 11.关闭套接字
# tcp_service_socket.close()
if __name__ == '__main__':
main()
Web服务器响应为‘helliworld’的报文主体,在浏览器中输入‘127.0.0.1:8080’ 即可查看到从服务器接受到的响应报文‘helloworld’.