zoukankan      html  css  js  c++  java
  • 网络编程之远程执行命令,粘包及解决方法

    tcp/udp 协议
    控制台输出带颜色

    今日内容: 

      远程执行命令:
        利用subprocess 模块
          subprocess.Popen(命令, shell=True, stdout = subprocess.PIPE, stderr=subprocess.PIPE)   

             第一个参数 传命令,

             第二个参数  表示 是正确的系统命令,

             第三个参数  是 接受正确信息的输出管道,

             第四个参数  是 接受错误信息的输出管道.

        利用 os模块里的  os.popen() 函数 也可以实现, 只不过 容易出现乱码的

          服务器具体代码:

    import socket
    import subprocess
    sk = socket.socket()
    sk.bind(('127.0.0.1',9090))
    sk.listen()
    conn,addr = sk.accept()
    while 1:
        cmd = conn.recv(1024).decode('utf-8')
        res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)
        std_out = res.stdout.read()# 读取正确的返回信息
        std_err = res.stderr.read()# 读取错误的返回信息
    
        if std_out:
            conn.send(std_out)
        else:
            conn.send(std_err)
    
    conn.close()
    sk.close()
    
    服务器(server)
    

      客户端具体代码:

    import socket
    sk = socket.socket()
    sk.connect_ex(('127.0.0.1',9090))
    while 1:
        cmd = input('请输入一个命令>>>')
        sk.send(cmd.encode('utf-8'))
        print(sk.recv(204800000).decode('gbk'))
    
    sk.close()
    
    客户端(client)
    

      

    补充: tcp协议 是面向数据流 形式的特点.

      粘包现象: 只有tcp有
        合包机制: 采用的是 nagle算法, 表示 在 缓存区内 判断出 如果要发送的数据比较小, 会稍微等等, 看后面有没有东西,如果有的话, 会一起发送给另一端, 此时这个就叫做 粘包.

          
        拆包机制:  拆包是因为, 在网络通信过程中, 基本上 允许的最大流量是1500, 所以不允许超过这个范围, 如果超过这个范围, 在缓存区中就会进行 拆包, 拆完后 在发送过去,  此时 如果允许接受的内容大小没有 发送过来的东西的内容大, 就会剩下一部分 在里面, 然后在下次 接收的时候 再读出来, 这样 也产生了粘包的现象

      udp协议 不会发生粘包现象, 因为udp协议是面向数据包形式的通信.

      解决粘包
        struct.pack('i', 数字) 此函数是把数字转换为 四个字节的 bytes类型的 数据
        struct.unpack() 此函数 是把被pack处理过的 数据 转化回去.

  • 相关阅读:
    ABP入门系列(10)——扩展AbpSession
    Asp.net mvc 知多少(五)
    ABP入门系列(9)——权限管理
    ABP入门系列(8)——Json格式化
    Asp.net mvc 知多少(四)
    SQL递归查询知多少
    ABP入门系列(7)——分页实现
    课程四(Convolutional Neural Networks),第三 周(Object detection) —— 0.Learning Goals
    课程四(Convolutional Neural Networks),第二 周(Deep convolutional models: case studies) ——3.Programming assignments : Residual Networks
    keras中的mini-batch gradient descent (转)
  • 原文地址:https://www.cnblogs.com/123zzy/p/9512165.html
Copyright © 2011-2022 走看看