zoukankan      html  css  js  c++  java
  • 用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:这种是比较理想的状态.
  • 相关阅读:
    文件处理
    字符编码的了解以及简单的文件处理
    python list去重加set排序
    数据的类型以及内置方法
    Python 入门 Day5
    Python 入门 Day3
    Python的入门
    计算机硬件
    【0903 | Day 29】反射和内置方法
    【0902 | Day 28】绑定方法和非绑定方法
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9505965.html
Copyright © 2011-2022 走看看