tcp与http协议 以及python的实现
htpp协议 Rquest Headers格式:
请求方法空格URL空格协议版本回车符换行符
头部字段名:值回车符换行符
···
头部字段名:值回车符换行符
回车符换行符
请求数据
socket网络聊天
服务端
#sokcet服务断
import socket
import threading
server = socket.socket()
# 绑定到0.0.0.0:8000端口上
server.bind(('0.0.0.0',8000)) # 如果是绑定127.0.0.1,那么只能本地连接
server.listen() def handle_sock(sock,addr):
while True:
# recv是阻塞的
tmp_data = sock.recv(1024)
print(tmp_data.decode("utf8"))
input_data = input()
sock.send(input_data.encode("utf8"))
# 获取客户端连接并启动线程去处理
while True:
# 阻塞,等待连接
sock,addr = server.accept() # 启动一个线程去处理新的用户连接
client_thread = threading.Thread(target=handle_sock,args=(sock,addr))
client_thread.start()
# sock.close()
客户端
# socket客户端
import socket
client = socket.socket()
client.connect(('192.168.2.129',8000))
while True: input_data = input()
client.send(input_data.encode('utf8'))
server_data = client.recv(1024)
print(server_data.decode('utf8')) client.close()
socket模拟http实现拉取百度首页源码:
# socket客户端
import socket
http_client = socket.socket()
http_client.connect(('www.baidu.com',80))
html = "GET / HTTP/1.1\r\nConnection:close\r\n\r\n"
http_client.send(html.encode("utf8")); data = b""
while True:
tmp = http_client.recv(1024)
if tmp:
data += tmp;
else:
break
print(data.decode('utf8'))
input()
socket模拟http实现nginx接受访问:
#tcp实现http协议
import socket
server = socket.socket() server.bind(('0.0.0.0',80))
server.listen()
# 获取客户端连接并启动线程去处理
while True:
print("等待连接")
# 阻塞,等待连接
sock,addr = server.accept()
tmp_data = sock.recv(1024)
print("收到浏览器信息:")
print(tmp_data.decode("utf8"))
# 谷歌浏览器访问 打印为:
# GET / HTTP/1.1
# Host: 192.168.2.129
# Connection: keep-alive
# Cache-Control: max-age=0
# Upgrade-Insecure-Requests: 1
# User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
# Accept-Encoding: gzip, deflate
# Accept-Language: zh-CN,zh;q=0.9
response_template = '''HTTP/1.1 200 OK <h1>hello</h1>'''
sock.send(response_template.encode("utf8"))
# 浏览器展示形式为:
# Request URL: http://192.168.2.129/
# Request Method: GET
# Status Code: 200 OK
# Remote Address: 192.168.2.129:80
# Referrer Policy: no-referrer-when-downgrade
print("已回信息")
sock.close()
print("已断开连接")
Rquest Headers
tcp与http协议 以及python的实现的更多相关文章
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
- arp协议分析&python编程实现arp欺骗抓图片
arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...
- TCP 和 UDP 协议
TCP 和 UDP 协议 一.socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
- 对TCP/IP网络协议的深入浅出归纳
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- 转:对TCP/IP网络协议的深入浅出归纳
转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没 ...
- 对TCP/IP网络协议的深入浅出归纳(转)
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- 关于tcp封装http协议
如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...
随机推荐
- mysql必知必会--使用MySQL
连接 在具有可供使用的MySQL DBMS和客户机软件之后,有必要简要讨 论一下如何连接到数据库. MySQL与所有客户机 - 服务器DBMS一样,要求在能执行命令之前登 录到DBMS.登录名可以与网 ...
- cf960F
输入给出m条边,要求找到一条最长的路径满足边按照输入的顺序出现并且权值严格递增 两种方法:第一种利用单调队列性质 第二种利用数据结构优化 #include<bits/stdc++.h> # ...
- 前后端分离-crud&svn
前后端分离-crud&svn 1. 跨域 1.1 什么是跨域 请求方与服务方的源不同,即跨域,包括: 1. 协议不同 2. 域名不同 3. 端口不同 1.2 跨域不一定存在跨域问题 什么情况下 ...
- css字体样式+文本样式
font-family属性值:具体字体名或者字体集 如果是中文或者有单词之间有空格,需要加双引号 字体集: Serif (有装饰线) Sans-serif (无装饰线) Monospace Cursi ...
- openssl CVE-2016-2107 漏洞检测
最近在安装python3 时升级openssl 版本,在摸索openssl 升级过程中才发现centos6 默认安装的openssl 1.0.1e 版本是有一个严重的漏洞的(Padding oracl ...
- 简单的leetcode题
简单的leetcode题 环绕字符串中唯一的子字符串 把字符串 s 看作是\("abcdefghijklmnopqrstuvwxyz"\)的无限环绕字符串,所以 s 看起来是这样的 ...
- Zabbbix之十二------Zabbix实现微信报警通知及创建聚合图形
实战一:实现zabbix监控微信报警 1.在企业微信上注册账号 1.注册企业微信,管理员需要写上自己的真实姓名,扫描以下的二维码,与微信关联真实姓名. 2.登陆企业微信,然后创建一个微信故障通知应用 ...
- MariaDB(MySQL)创建、删除、选择及数据类型使用详解
一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行 ...
- Vue项目中实现tab栏和步骤条的数据联动
也就是tab栏切换步骤条随之变化 <template> <div> <!-- 面包屑导航 --> <el-breadcrumb sepa ...
- ECMAScript基本对象——RegExp 正则表达式对象
含义:定义字符串的组成规则 使用: 1.定义单个字符:[ ] [a] 表示有一个字符是 小写的a [ab] 表示有一个字符是 小写的a或者b [a-z] 表示有一个字符是 小写的a到z [a-z ...