帅爆太阳的男人

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文件调用操作系统的命名,粘包问题的更多相关文章

  1. 使用bat脚本调用py文件直接获取应用的包名和targetversion

    背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修 ...

  2. python socket实现文件传输(防粘包)

    1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...

  3. Django-自己写的py文件调用models&Non-ASCII character报错&url接收参数

    1.这个设置是网上能查到的最多的,但是没解决我的问题: Django的models.py在外部独立使用,新建一个文件夹,和monitor1目录平级 import sys,os sys.path.app ...

  4. python中pycharm中.py文件调用一个.py文件的函数

    在相同文件夹内调用函数: file1.py def add(x,y): print('和为:%d'%(x+y)) file2.py import A A.add(1,2)

  5. Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...

  6. python 项目中包中__init__.py文件的作用

    开发python项目时,我遇到了一个这样的现象,当我新建一个pythonpackage时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么, ...

  7. 18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

    原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了.当 ...

  8. Socket编程(4)TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  9. TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

随机推荐

  1. nginx配置实现负载均衡

    一.负载均衡的作用 1.转发功能 按照一定的算法[权重.轮询],将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量. 2.故障移除 通过心跳检测的方式,判断应用服务器当前是否可以正 ...

  2. UML-画类图与交互图的顺序

    并行.画完交互图,在画类图.交替进行.

  3. eclipse包分层

    方法很简单,如下图所示: 1.点击项目栏窗口的右上角的倒三角 2.选择Pachage Presentation(包呈现) 3.选择Hierarchical(分层)

  4. python msg_box

    转自:http://www.cnblogs.com/otfsenter/ # _*_ coding: utf-8 _*_ # @Time : 2017/3/27 17:39 # @Author : o ...

  5. qrcode.js扫码邀请

    //js引用部分<script src="../qrcode.js" type="text/javascript"></script> ...

  6. 18Spring后置通知

    Spring后置通知,和前置通知类似,直接看代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalc ...

  7. LINUX系统---初级相关操作和知识

    LINUX系统的初级,从安装LINUX开始,到处理简单的运维问题.搭建各种服务.解决网路问题.缓解服务器压力,写简单的shell脚本. 我们从基本的入门开始搞事情: 安装LINUX系统 对磁盘的使用 ...

  8. linux虚拟环境搭建

    一.virtualenv的安装与使用 1.安装virtualenv pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualen ...

  9. MyBatis 多参问题

    当传入的参数为多个参数时 1 可以不封装为Javabean直接传入,写法如下 public List<XXXBean> getXXXBeanList(String xxId, String ...

  10. admin源码之url设计

    如何实现批量设计url? 1.创建Django项目 2.新建app01 和 app02 3.在models.py中创建模型 4.在settings.py中完成数据库配置.app配置等 5.数据库迁移 ...