用py文件调用操作系统的命名,粘包问题
帅爆太阳的男人
1,执行代码
- 在py代码中去调用操作系统的命令
- 新的模块:subprocess,
import subprocess
r = subprocess().Popen(
"dir",
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
解释:
- cmd:代表系统命令
- shell=True代表这条命令是系统命令,告诉操作系统,将cmd当成系统命令去执行
- stdout 是执行完系统命令之后,用于保存结果的一个管道
- stderr 是执行完系统命令之后,用于保存错误结果的一个管道
- print(r.stdout().decode("gbk"))
- print(r.stderr().decode("gbk"))
执行命令:
- 服务器端
import socket
import subprocess # 一个可以通过程序调用操作系统的命令的模块
sk = socket.socket()
sk.bind(("127.0.0.1",8008))
sk.listen()
conn,addr = sk.accept()
while 1:
cmd = conn.recv(1024).decode("utf-8")
r = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # 固定写法,一个参数都不能少
stdout = r.stdout.read() # 当时正确的调用命令就读出来
stderr = r.stderr.read() # 错误的命令也读出来
if stdout:
conn.send(stdout)
else:
conn.send(stderr)
conn.close()
sk.close()
- 客户端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",8008))
while 1:
sk.send(input("请输入操作的命令:").encode("utf-8")) # 客户端给服务器操作指令,再有服务器返回给客户端
result = sk.recv(1024).decode("gbk") # 由操作系统返回给客户端的命令信息必须是:gbk解码
print(result)
sk.close()
2,粘包问题:只有TCP协议有粘包,UDP不会发生粘包
- 粘包的原因:发送端发送数据,接收端不知道该如何去接收,造成的一种数据混乱的现象
- 在Tcp协议中:
- 有一个合包机制(nagle算法),将多次连续发送且间隔较小的数据,进行打包成一块数据去传送
- 另一个是拆包机制,在发送端,因为受到网卡的MTU限制,会将大的超过MTU限制的数据,进行拆分,拆分成多个小的数据,进行传输,当传输到目标主机的操作系统层时,会重新将多个小的数据合并成原来的数据
# 客户端
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8001))
sk.listen()
conn,addr = sk.accept()
while 1:
conn.send(b"hello")
conn.send(b"world")
conn.close()
sk.close()
- 服务端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",8001))
msg1 = sk.recv(1024)
msg2 = sk.recv(1024)
print(msg1,type(msg1))
print(msg2,type(msg2))
sk.close()
3,针对,使用UDP协议发送数据,一次收发的大小究竟多少合适?
- UDP不会发生粘包,UDP协议本层对一次收发数据大小的限制是:65535-ip包头(20)-UDP包头(8)=65507
- 站在数据链路层,因为网卡的MTU一般被限制在了1500,所以对于数据链路层来说一次收发数据的大小被限制在:1500-ip包头(20)-UDP包头(8) = 1472
- 所以:sendto(num)
- if num>65507:报错
- elif:1472<num<65507:会在数据链路层拆包,而UDP本身就是不可靠协议,所以一旦拆包之后,造成的多个小数据包在网络传输中,如果丢任何一个,那么此次数据传输失败
- else:num<1742:这种是比较理想的状态.
用py文件调用操作系统的命名,粘包问题的更多相关文章
- 使用bat脚本调用py文件直接获取应用的包名和targetversion
背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修 ...
- python socket实现文件传输(防粘包)
1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...
- Django-自己写的py文件调用models&Non-ASCII character报错&url接收参数
1.这个设置是网上能查到的最多的,但是没解决我的问题: Django的models.py在外部独立使用,新建一个文件夹,和monitor1目录平级 import sys,os sys.path.app ...
- python中pycharm中.py文件调用一个.py文件的函数
在相同文件夹内调用函数: file1.py def add(x,y): print('和为:%d'%(x+y)) file2.py import A A.add(1,2)
- Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...
- python 项目中包中__init__.py文件的作用
开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...
- 18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了.当 ...
- Socket编程(4)TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
- TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
随机推荐
- PowerPoint幻灯片手动翻页设置技巧
步骤: 幻灯片放映>设置幻灯片放映>手动
- vue中去掉烦人的格式警告(eslint )
解决办法: 一,源头上解决,下次创建项目时就不要使用eslint连接项目代码 如上图所示,就是在这一步的时候选择no: 二,在build文件夹中找到webpack.base.conf.js文件 找到右 ...
- 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积
出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...
- Mysql对象
2.简介 2.1 存储过程 2.1.1什么是存储过程 存储过程就是一种类似函数的脚本,可以把多个sql语句组合起来,然后使用 call 存储过程名 来调用,从而执行这些SQL语句. 特点:一次编译,下 ...
- 使用TensorRT加速yolo3
一.TensorRT支持的模型: TensorRT 直接支持的model有ONNX.Caffe.TensorFlow,其他常见model建议先转化成ONNX.总结如下: 1 ONNX(.onnx) 2 ...
- Zabbix微信告警
Zabbix微信告警 摘要 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信 ...
- 运维笔记:zabbix的运用(1)安装过程
前言 如果是用了阿里云或者腾讯云,他们都有各种监控帮我们做好.但是如果是遇到了自己维护自己机房的服务器,那么一些可视化或者监控就很有意义了.监控可能有很多种方案,这里就以比较老牌通吃的zabbix来解 ...
- PHP:GD库 生成验证码图片
文章来源:http://www.cnblogs.com/hello-tl/p/7592998.html <?php /** * __construct($new):构造函数创建一张图片$new- ...
- [学习资料] Tiny210(S5PV210) u-boot移植
Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...
- django2
八 Models 数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使用sqlit ...