用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 ...
随机推荐
- js 上传图片、压缩、旋转
亲测 <!doctype html> <html> <head> <meta charset="utf-8"> <title& ...
- 启动web项目卡在Initializing Spring root WebApplicationContext不动
这几天在和同学一起做一个电教器材管理系统的Web项目,用SVN互通,在此记录下经常遇到的bug. Bug: 启动项目一直卡在Initializing Spring root WebApplicatio ...
- 启发式合并 CodeForces - 600E
启发式合并最重要的思想就是指的是每次将小集合拷贝合并至大集合.考虑每个元素的合并开销.对于合并次数最多的那个元素来说,它每合并一次,所在集合的规模扩大两倍,最多只会合并 logN 次,因而对于所有元素 ...
- Python学习-列表的修改,删除操作
列表的修改操作 列表中的许多操作和字符串中有许多的相同点,因为列表是一个有顺序可变的元素集合,所以在列表中可以进行增加,删除,修改,查找的操作. 列表的修改操作: 如果你想单个修改列表中的某一个元素, ...
- PHP—通过HTML网页请求,PHP页面显示源码不能解析
对于初学者来说,可能会碰到这样一个问题,那就是我们通过html网页,在表单的action中填入后台处理的php文件后,虽然可以跳转到php网页上,但是却显示一大堆php源码而不是处理请求.像这样: ...
- js ajax 传送xml dom对象到服务器
客户端代码 1 <script> var isie = true; var xmlhttp = null; function createXMLHTTP() {//创建XMLXMLHttp ...
- Python之“Hello World”
Python之“Hello World” 了解Python: 编译型和解释型 编译:把明文代码执行前,先转换成二进制,在执行.这个过程叫编译 解释器:将明文代码转成二进制的 Linux中,gcc编译, ...
- stark组件之显示页面内容搭建(六)
之前主要介绍了前端页面list_fiter功能的显示,但是list_display功能的展示并没有过多介绍,这里介绍一下是如何实现的. 可以看到凡是蓝线圈起来的都是通过字段名反射一个个取出来的,红线的 ...
- Unity3D 固定功能函数
Unity 3D 测试固定功能函数执行顺序 1. 在GameObject和脚本激活状态下,测试: 2. 在GameObject激活状态下,测试: 3. 在2种情况都不激活的状态下测试:脚本无输出: 函 ...
- About SQL Server 2016 CPT2
SQL Server 2016 CTP2已经发布,可以从以下主页进行下载. http://www.microsoft.com/en-us/server-cloud/products/sql-serve ...