网络编程之远程执行命令,粘包及解决方法

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处理过的 数据 转化回去.

原文地址:https://www.cnblogs.com/123zzy/p/9512165.html