• 黏包


    一.subprocess模块

    在学习这个模块前,我们先用Python的help()函数查看一下subprocess模块是干嘛的:

    即允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。

     subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。

    应用:

    1 import subprocess
    2 
    3 res=subprocess.Popen("ipconfig",
    4                      shell=True,
    5                      stderr=subprocess.PIPE,
    6                      stdout=subprocess.PIPE)
    7 
    8 print(res.stdout.read().decode("gbk"))

     简单应用

     1 import socket
     2 import subprocess
     3 
     4 sever=socket.socket()
     5 
     6 sever.bind(('192.168.13.137',8016))
     7 
     8 sever.listen(10)
     9 
    10 while True:
    11     print('服务器准备好了')
    12     conn,addr=sever.accept()
    13 
    14     while True:
    15         try:
    16             cmd=conn.recv(1024).decode('utf-8')
    17             if cmd=='exit':
    18                 break
    19             res=subprocess.Popen(cmd,
    20                              shell=True,
    21                              stderr=subprocess.PIPE,
    22                              stdout=subprocess.PIPE,
    23                              )
    24             out=res.stdout.read()
    25             err = res.stderr.read()
    26             if out:
    27                 conn.send(out)
    28 
    29             else:
    30                 conn.send(err)
    31 
    32         except Exception as e:
    33             break
    34     conn.close()
    服务端
     1 import socket
     2 client=socket.socket()
     3 client.connect(('192.168.13.137',8016))
     4 while True:
     5     cmd=input('请输入命令:')
     6     if cmd=='exit':
     7         client.send(cmd.encode('utf-8'))
     8         break
     9     client.send(cmd.encode('utf-8'))
    10     ret=client.recv(1024)
    11     print(ret.decode('gbk'))
    客户端

     二.黏包

    1..struct模块
    1 import struct
    2 res=struct.pack('i',12535353)  #压包
    3 print(res)
    4 print(len(res))
    5 ret=struct.unpack('i',res)  #解包
    6 print(ret[0])

    实例:

     1 import socket
     2 import subprocess
     3 
     4 sever=socket.socket()
     5 
     6 sever.bind(('192.168.13.137',8016))
     7 
     8 sever.listen(10)
     9 
    10 while True:
    11     print('服务器准备好了')
    12     conn,addr=sever.accept()
    13 
    14     while True:
    15         try:
    16             cmd=conn.recv(1024).decode('utf-8')
    17             if cmd=='exit':
    18                 break
    19             res=subprocess.Popen(cmd,
    20                              shell=True,
    21                              stderr=subprocess.PIPE,
    22                              stdout=subprocess.PIPE,
    23                              )
    24             out=res.stdout.read()
    25             err = res.stderr.read()
    26             if out:
    27                 import struct
    28                 header_pack = struct.pack('i', len(out))
    29                 # 发送报头
    30                 conn.send(header_pack)
    31                 # 发送数据
    32                 conn.send(out)
    33 
    34             else:
    35                 # 构建报头数据
    36                 import struct
    37                 header_pack=struct.pack('i',len(err))
    38                 # 发送报头
    39                 conn.send(header_pack)
    40                 # 发送数据
    41                 conn.send(err)
    42 
    43         except Exception as e:
    44             break
    45     conn.close()
    服务端
     1 import socket
     2 import struct
     3 client=socket.socket()
     4 client.connect(('192.168.13.137',8016))
     5 while True:
     6     cmd=input('请输入命令:')
     7     if cmd=='exit':
     8         client.send(cmd.encode('utf-8'))
     9         break
    10     client.send(cmd.encode('utf-8'))
    11     header_pack=client.recv(4)
    12     data_length=struct.unpack('i',header_pack)
    13 
    14     recv_data_length=0
    15     total_size=b''
    16     while recv_data_length<data_length[0]:
    17         data=client.recv(1024)
    18         recv_data_length+=len(data)
    19         total_size+=data
    20     print(total_size.decode('gbk'))
    客户端

     2.hashlib模块

    1 import hashlib
    2 md5=hashlib.md5()
    3 md5.update(b'sd')
    4 md5.update(b'ghjk')  #追加上传,不是覆盖
    5 print(md5.hexdigest())
     1 import hashlib
     2 md5=hashlib.sha3_512()  #加密效果更好
     3 md5.update(b'sd')
     4 md5.update(b'ghjk')
     5 print(md5.hexdigest())
     6 
     7 import hashlib
     8 md5=hashlib.sha3_256()  #加密效果更好
     9 md5.update(b'sd')
    10 md5.update(b'ghjk')
    11 print(md5.hexdigest())
    加密效果更好
  • 相关阅读:
    搜索各种按钮图标的网页
    查找数据库中所有有自增列的用户表
    清明时节的随想
    基础数据的来源的统一
    使用VS2012开发的网站或者webservice在IIS6.0上发布的注意事项
    [六、页面跳转]21快速打开一个警告窗口
    [六、页面跳转]17使用@SceneStorage存储各个场景的状态
    [六、页面跳转]15使用@Environment访问环境中的指定key的值
    [六、页面跳转]22快速打开一个动作表单
    [六、页面跳转]20通过popover方法快速打开模态窗口
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9584701.html
Copyright © 2020-2023  润新知