1.HTTP

首先讲一下http和https,详细可以去看runoob http-vs-https

基本概念

HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。

HTTP默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。

HTTP
协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:

1、TCP 三次同步握手 2、客户端验证服务器数字证书 3、DH 算法协商对称加密算法的密钥、hash 算法的密钥 4、SSL
安全加密隧道协商完成
5、网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改。

截至 2018 年 6 月,Alexa 排名前 100 万的网站中有 34.6% 使用 HTTPS 作为默认值,互联网 141387
个最受欢迎网站的 43.1% 具有安全实施的 HTTPS,以及 45% 的页面加载(透过Firefox纪录)使用HTTPS。2017 年3
月,中国注册域名总数的 0.11%使用 HTTPS。

根据 Mozilla 统计,自 2017 年 1 月以来,超过一半的网站流量被加密。

HTTP 与 HTTPS 区别

HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。

socket

2.Python http

具体可以参考:http — HTTP 模块

http 是一个包,它收集了多个用于处理超文本传输协议的模块:

  • http.client 是一个低层级的 HTTP 协议客户端;对于高层级的 URL 访问请使用 urllib.request

  • http.server 包含基于 socketserver 的基本 HTTP 服务类

  • http.cookies 包含一些有用来实现通过 cookies 进行状态管理的工具

  • http.cookiejar 提供了 cookies 的持久化

http 也是一个通过 http.HTTPStatus 枚举定义了一些 HTTP 状态码以及相关联消息的模块

class http.HTTPStatus

3.源码实例

server.py

#coding=utf-8
import http.client
import urllib
from http.server import HTTPServer, BaseHTTPRequestHandler
import jsondef start_server():data = {'result': 'this is a test'}host = ('localhost', 8981)class Resquest(BaseHTTPRequestHandler):def do_GET(self):data={"Method:":self.command,"Path:":self.path}print(data)self.send_response(200)self.send_header('Content-type', 'application/json')self.end_headers()self.wfile.write(json.dumps(data).encode())def do_POST(self):length = int(self.headers['Content-Length'])post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))# You now have a dictionary of the post datadata = {"Method:": self.command,"Path:": self.path,"Post Data":post_data}print(data)self.send_response(200)self.send_header('Content-type', 'application/json')self.end_headers()self.wfile.write(json.dumps(data).encode())def do_HEAD(self):data = {"Method:": self.command,"Path:": self.path,"Header Content-type": self.headers.get('Content-type')}print(data)self.send_response(200)self.send_header("Content-type", "text/html")self.end_headers()self.wfile.write(json.dumps(data).encode())def do_PUT(self):data = {"Method:": self.command,"Path:": self.path,"Header Content-type": self.headers.get('Content-type')}print(data)path = self.pathcontent_length = int(self.headers.get('content-length'))content = self.rfile.read(content_length)#safe_mkdir(os.path.dirname(path))with open("D:/code/pyhttp/put_datas.txt", 'ab') as outfile:outfile.write(content)self.send_response(200)self.end_headers()self.wfile.write(json.dumps(data).encode())server = HTTPServer(host, Resquest)print("Starting server, listen at: %s:%s" % host)server.serve_forever()if __name__ == '__main__':start_server()print("start server success...")

client.py

#coding=utf-8
import http.client
from urllib import request, parsedef send_get(url,path,data):conn = http.client.HTTPConnection(url)conn.request("GET", path)r1 = conn.getresponse()print(r1.status, r1.reason)data1 = r1.read()print(data1)  #conn.close()def send_post(url,path,data,header):conn = http.client.HTTPConnection(url)conn.request("POST", path,data,header)r1 = conn.getresponse()print(r1.status, r1.reason)data1 = r1.read()print(data1)  #conn.close()
def send_head(url,path,data,header):conn = http.client.HTTPConnection(url)conn.request("HEAD", path,data,header)r1 = conn.getresponse()print(r1.status, r1.reason)data1 = r1.headers  #print(data1)  #conn.close()
def send_put(url,path,filedata,header):conn = http.client.HTTPConnection(url)conn.request("PUT", path,filedata,header)r1 = conn.getresponse()print(r1.status, r1.reason)data1 = r1.read()  #print(data1)conn.close()if __name__ == '__main__':url="localhost:8981"data = {'my post data': 'I am client , hello world',}datas = parse.urlencode(data).encode('utf-8')headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}print("----------Send get test:-----------")send_get(url,path="/index",data="None")print("----------Send post test:-----------")send_post(url, path="/index",data=datas,header=headers)print("----------Send head test:-----------")send_head(url, path="/index", data=datas, header=headers)print("----------Send put test:-----------")tfile=open("test.txt",encoding="utf-8",mode='r')filedatas=tfile.read()fileheaders = {"Content-type": "text/plain", "Accept": "text/plain",\"content-length":str(len(filedatas))}send_put(url, path="/index", filedata=filedatas, header=fileheaders)

效果:

4.完整代码下载

https://download.csdn.net/download/Datapad/19119843

【Python 基础】网络编程 - Python写一个简单的HTTP服务端和客户端,实现Client/Server交互相关推荐

  1. netcore 实现一个简单的Grpc 服务端和客户端

    参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...

  2. C++socket编程(三):3.6 服务端recv客户端发送的数据

    服务端中获取客户端发送过来的数据一定是关闭套接字之前进行,close之后就收不到数据了. 一般读取数据一般用read,windows上一般用recv(本质上也是read),但是为了跨平台,所以一般用r ...

  3. 简单的c++服务端与客户端的通信

    本篇博客是本人没有深入学习网络通信,对其浅浅的了解了一下,只知道怎么连接以及发送内容,若内容有什么错误的地方还麻烦各位大佬可以指出来大家一起讨论一下.   服务端代码如下: #include < ...

  4. Python基础——网络编程

    在网络编程中主要是使用Socket(套接字)进行编程,套接字相当于应用程序访问下层网络的服务的接口,使用Socket可以是得不同主机之间进行通信,从而实现数据交换. 1.Socket工作方式 套接字在 ...

  5. python可视化界面编程 pycharm_pycharm开发一个简单界面和通用mvc模板(操作方法图解)...

    文章首先使用pycharm的 PyQt5 Designer 做一个简单的界面,然后引入所谓的"mvc框架". 一.设计登录界面 下面开始第一个话题,使用pycharm的 PyQt5 ...

  6. Python之网络编程(实现一个多用户同时在线的FTP用户管理程序)

    最近虽然一直在复习C语言,但是Python的学习是没有停下的.这几天的成果就是这个实现多用户同时在线的FTP用户管理程序. 这个程序其实是比较难的,需要一个完整的框架,创建各种需要的模块和各种函数才能 ...

  7. Day31 python基础--网络编程基础-socketserver

    一,验证客户端合法性 #server端 import os import hmac import socket secret_key = b'alex_sb'def auth(conn):msg = ...

  8. UNIX网络编程笔记(2):一个简单的时间获取程序

    这一讲通过一个简单的时间获取程序简单介绍套接字编程. 1.套接字API 1.1.套接字地址结构 上一讲中介绍了TCP的一些内容,知道了一个套接字对唯一标识了网络中的一个TCP连接,而一个套接字标识了一 ...

  9. java基础总结(三十一)--利用java代码写出http请求的服务端与客户端代码

    来自https://www.cnblogs.com/Nouno/p/5719010.html java开发接口利用http协议传输数据 这个接口主要用来登录,java服务器提供一个接口,移动设备客户端 ...

最新文章

  1. Intellij IDEA 2018.2 搭建Spring Boot 应用
  2. 通过有序数组生成平衡搜索二叉树
  3. 绘制半圆_超细致:Ai绘制萌蠢可爱卡通形象
  4. 进程共享变量#pragma data_seg用法
  5. Java中的访问者设计模式–示例教程
  6. 《R语言机器学习:实用案例分析》——1.3节使用函数
  7. nginx同一域名下部署多个vue项目
  8. echarts3与echarts2区别
  9. 编程语言大牛王垠的过去和现状
  10. css textarea行数_关于textarea元素的cols和rows属性
  11. web 计算器_计算器中的奢侈品——CASIO S200
  12. linux 的源码怎么查看,查看linux源代码
  13. NRF52840 和电脑 进行蓝牙通信
  14. JAVA中RandomAccess接口
  15. 好的博客学习的地址【持续更新中】
  16. oracle 里sum(0),sum(1) ,sum(2) ,sum(num) over,count(*) over() ,coun(*),count(1)
  17. 黄金时代 —— Pytorch学习记录(一)
  18. 以太网通信,UDP通信
  19. 国外客户搜索引擎对比,Snovio为代表的外贸助手功能一览
  20. vue2与vue3的区别

热门文章

  1. 攻防世界逆向game(IDA pro 7.6)
  2. Seata - @GlobalTransactional源码解析
  3. 机器学习——最小二乘法,闭式解矩阵推导
  4. lintcode练习 - 436. 最大正方形
  5. 开源鸿蒙、元宇宙、区块链、开源大集合 | AloT开源科技节暨OpenHarmony技术论坛正火热报名中
  6. MySql查询(各种操作)
  7. 调节e18-d80nk的测量距离_新一代验光机单眼调节幅度的客观测量重复性
  8. hi3536 uvc驱动配置
  9. 心理测评软件语音导读播报功能:2022年率先实现的一个功能
  10. 合肥工业大学计算机考研试题,2016年合肥工业大学计算机考研真题及答案