(day27)subprocess模块+粘包问题+struct模块+ UDP协议+socketserver
目录
昨日回顾
软件开发架构
C/S架构
Client:客户端
Server:服务端
优点
占用网络资源少,软件的使用稳定
缺点
用户在使用多个软件要下载客户端,软件每次更新用户也需要更新
用户体验差
B/S架构
Broser:浏览器
Server:服务端
优点
用户不需要下载多个客户端,以浏览器充当所有软件的客户端
缺点
网络资源占用较大,网络不稳定时,软件的使用也不稳定
网络编程
- 实现远程通信
- 物理连接介质:网卡等
- 互联网协议
互联网协议
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
物理层
- 基于电信号发送一堆二进制数据
数据链路层
把二进制数据交给"以太网协议"处理:
规定好电信号的分组方式
必须要有一个网卡
mac的地址
由12位唯一的编码
前6位:厂商号
后6位:流水号
以太网协议
- 广播,单播
- 弊端:广播风暴,无法跨局域网通信
交换机
让多台电脑连接在一起
互联网
让所有电脑都互联到一起
网络层
连接到互联的电脑都需要有一个IP地址
- IP地址
- 用于唯一标识计算机(局域网)具体位置
- 点分十进制
- 最小值:0.0.0.0
- 最最大值:255.255.255.255
传输层
TCP/UDP协议
TCP:流式协议
基于TCP协议进行通信,必须要创建双向通道
- 一个是客户端往服务端的管道
- 一个是服务端往客户端的管道
三次握手,四次挥手
反馈机制
客户端发送信息,服务端,必须返回确认机制,否则客户端会一直发送请求
应用层
- http(重点),ftp(了解)
socket套接字
# 服务端.py
import socket
server = socket.socket()
server.bind(('127.0.0.1',8888))
server.listen(5) # 半连接池
while True:
conn,addr = server.accept()
while True:
try:
data = conn.recv(1024).decode('utf-8') # recv数据从内存中获取
if data == 'q':
break
print(data)
conn.send(data.encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
# 客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1'.8888))
while True:
msg = input('>>')
client.send(msg.encode('utf-8'))
if msg == 'q':
break
data = client.recv(1024).decode('utf-8')
print(data)
client.close()
今日内容
一、subprocess模块
可以通过代码执行操作系统的终端命令
并返回终端执行命令的结果
import subprocess
cmd = input('cmd>>>:')
obj = subprocess.popen(
cmd, # cmd命令
Shell = True,
stdout = subprocess.PIPE, # 返回正确结果
stderr = subprocess.PIPE # 返回错误结果
)
data1 = obj.stdout.read()
data2 = obj.stderr.read()
result = data1 + data2
print(result.decode('gbk'))
二、粘包问题
- 服务端第一次发送的数据,客户端无法精确一次性接受完毕,下一次发送的数据就与上一次数据粘在一起
- 无法预测对象需要接受的数据大小长度
- 多次连续发送数据量小,并且间隔时间短的数据一次性打包发送过去
TCP协议特性
TCP是一个流式协议,会将多次连续发送数据量小,并且间隔时间短的数据一次性打包发送过去
三、struct模块
解决粘包问题, 是一个可以将很长的数据的长度,压缩成固定的一个标记(数据包头)
- 必须先定义报头,发送报头,在发送真实数据
import struct # 打包压缩 # i:模式,会将数据长度压缩成4个bytes str = '1123fsgsdasfdasfaa' # 模拟客户端 # 包头 headers = struct.pack('i',len(str)) print(len(headers)) # 4 # 模拟服务端 # headers = conn.recv(4) datalen = struct.unpack('i',headers) # 元组(len(str),) print(data_len[0]) # len(str)既想发送文件,又想发送文件的描述信息
客户端发送字典给服务端
# 服务端.py import socket import json import struct server = socket.socket() server.bind( ('127.0.0.1', 9527) ) server.listen(5) while True: conn, addr = server.accept() while True: try: # 先接收报头 headers = conn.recv(4) # 解包获取真实数据长度 data_len = struct.unpack('i', headers)[0] # 获取字典数据真实长度 bytes_data = conn.recv(data_len) back_dic = json.loads(bytes_data.decode('utf-8')) print(back_dic) except Exception as e: print(e) break conn.close()# 客户端.py import socket import struct import json import time client = socket.socket() client.connect( ('127.0.0.1', 9527) ) while True: send_dic = { 'file_name': 'jason真实写真集.avi', 'file_size': 10000000 # 10G } # json序列化,并转码成bytes类型数据 json_data = json.dumps(send_dic) bytes_data = json_data.encode('utf-8') # 先做报头 headers = struct.pack('i', len(bytes_data)) client.send(headers) client.send(bytes_data) time.sleep(10)
四、UDP
UDP是一种传输协议
- 不需要建立双向通道
- 不会粘包
- 客户端给服务端发送数据不需要等待服务端返回接受成功
- 数据容易丢失,不安全
# 服务端
import socket
# SOCK_DGRAM:代表UDP
server = socket.scoket(type = socket.SOCK_DGRAM)
server.bind(('127.0.0.1',9527))
msg, addr = server.recvfrom(1024)
# 客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
server_ip_port = ('127.0.0.1',9527)
client.sendto(b'hello',server_ip_port)
五、QQ聊天室
基于UDP实现QQ聊天室
# 服务端
import socket
server = socket.socket(type = socket.SOCK_DGRAM)
server.bind(('127.0.0.1',9527))
while True:
msg,addr = server.recvfrom(1024)
print(addr)
print(msg.decode('utf-8'))
send_msg = input('服务端:')
server.sendto(send_msg.encode('utf-8'),addr)
# 客户端
import socket
client = socket.socket(type = socket.SOCK_DGRAM)
addr= ('127.0.0.1',9527)
while True:
send_msg = input('客户端1:')
client.sendto(send_msg.encode('utf-8'),addr)
back_msg ,addr= client.recvfrom(1024)
print(back_msg.decode('utf-8'))
六、SocketServer
python内置模块,可以简化socket套接字TCP/UDP服务端的代码
import socketserver
# 定义类
class MyTcpServer(socketserver.BaseRequestHandler)
# 重新父类的handler
def handler(self):
# 1. 接收消息
data = self.request.recv() # conn.recv(1024)
# 2. 给客户端发送消息
send_msg = input('服务端:').encode('utf-8')
self.request.send(send_msg)
if __name__= '__main__':
server = socketserver.TCPserver(('127.0.0.1',8888),MyTcpServer)
server.serve_forever()
(day27)subprocess模块+粘包问题+struct模块+ UDP协议+socketserver的更多相关文章
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块
前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- python网络编程-socket套接字通信循环-粘包问题-struct模块-02
前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
- UDP协议&socketserver模块
UDP协议&socketserver模块 一.UDP协议 1.1 UDP实现简单通信 服务器 ------------------------------------------------- ...
- socker通信-struct模块-粘包问题
Socket概念 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对 ...
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- scoket模块 粘包问题 tcp协议特点 重启服务器会遇到地址被占用问题
scoket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) 获取tcp/ip套接字 tcpsock ...
随机推荐
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- Kafka系列一之架构介绍和安装
Kafka架构介绍和安装 写在前面 还是那句话,当你学习一个新的东西之前,你总得知道这个东西是什么?这个东西可以用来做什么?然后你才会去学习它,使用它.简单来说,kafka既是一个消息队列,如今,它也 ...
- Python学习笔记整理总结【Django】:Form组件
Form组件 Django的Form主要具有一下几大功能: --生成HTML标签 --验证用户数据(显示错误信息) --HTML Form提交保留上次提交数据 --初始化页面显示内容 1.内置字段 ...
- MySQL中四种隔离级别的演示
事务的隔离是并发操作中需要理解清楚的问题.MySQL中共有4种不同的隔离级别,这4种隔离级别分别是: 隔离级别类型 影响结果 READ UNCOMMITTED(未提交读) 事务将会读取到未提交的数据, ...
- Spring 梳理-AOP
界面应用场景 日志.声明式事务.安全.缓存 AOP功能演化图 图片引用地址:https://www.cnblogs.com/best/p/5679656.html AOP设计模式-代理模式 静态代理: ...
- Hadoop源代码点滴-系统结构(HDFS+YARN)
Hadoop建立起HDFS和YARN两个字系统,前者是文件系统,管数据存储:后者是计算框架,管数据处理. 如果只有HDFS而没有YARN,那么Hadoop集群可以被用作容错哦的文件服务器,别的就没有什 ...
- plsql导入导出表结构和数据对象
一.Tools的导出表结构:export User objects 二.Tools的Export Tables选项 导出表数据:export tables (选择:exp.exe) 三. 导入表结构: ...
- 关于CSS书写规范、顺序
关于CSS的书写规范和顺序,是大部分前端er都必须要攻克的一门关卡,如果没有按照良好的CSS书写规范来写CSS代码,会影响代码的阅读体验.这里总结了一个CSS书写规范.CSS书写顺序供大家参考,这些是 ...
- Knative 暂时不会捐给任何基金会 | 云原生生态周报 Vol. 22
作者 | 新胜.心贵.进超.元毅.衷源 业界要闻 谷歌:不会向任何基金会捐赠 Knative 自 Knative 项目开始以来,一直存在关于是否将 Knative 捐赠给基金会(例如 CNCF)的疑问 ...
- vue 上传文件 和 下载文件 面试的时候被问到过
Vue上传文件,不必使用什么element 的uplaod, 也不用什么npm上找的个人写的包,就用原生的Vue加axios就行了, 废话不多说,直接上代码:html: <input type= ...