黏包

一.subprocess模塊shell

在學習這個模塊前,咱們先用Python的help()函數查看一下subprocess模塊是幹嗎的:服務器

即容許你去建立一個新的進程讓其執行另外的程序,並與它進行通訊,獲取標準的輸入、標準輸出、標準錯誤以及返回碼等。socket

 subprocess模塊中定義了一個Popen類,經過它能夠來建立進程,並與其進行復雜的交互。ide

應用:函數

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])

實例:spa

 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模塊3d

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())
加密效果更好
相關文章
相關標籤/搜索