粘包3

用tcp协议进行远程控制;服务端代码:

解决粘包方法一:

 1 from socket import *
 2 import subprocess
 3 
 4 tcp_server = socket(AF_INET, SOCK_STREAM)
 5 tcp_server.bind(('127.0.0.1', 8080))
 6 tcp_server.listen(128)
 7 while True:
 8     print('等待新用户连接')
 9     coon, addr = tcp_server.accept()
10     print('新的客户端连接:', addr)
11     while True:
12         try:
13             cmd = coon.recv(1024)
14             print('执行的命令为', cmd.decode())
15             res = subprocess.Popen(cmd.decode(), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
16                                    stdin=subprocess.PIPE)
17             err = res.stderr.read()
18             if err:
19                 cmd_res = err
20             else:
21                 cmd_res = res.stdout.read()
22             if not cmd_res:
23                 cmd_res = '执行成功'.encode('GBK')
24             length = len(cmd_res)  # 计算字节的长度,长度为整型
25             coon.send(str(length).encode())  # 将字节的长度发送给客户端,注意需将整型变为字符串后在转化为字节发送。
26             begin_start = coon.recv(1024)
27             if begin_start.decode() == '开始接收':
28                 coon.send(cmd_res)
29 
30         except Exception as f:
31             break
32 
33     coon.close()

客户端代码  :

 1 from socket import *
 2 
 3 tcp_client = socket(AF_INET, SOCK_STREAM)
 4 tcp_client.connect(('127.0.0.1', 8080))
 5 while True:
 6     cmd = input('请输入指令:').strip()
 7     if not cmd: continue
 8     if cmd == 'quit': break
 9     tcp_client.send(cmd.encode())
10     num = tcp_client.recv(1024)  # 收到的服务端发来的字节长度,注意此时为字节
11     tcp_client.send('开始接收'.encode())
12     num = int(num.decode())  # 将字节变为字符串(此字符串为整型字符串),然后变为整型
13     recv_size = 0
14     data = b''
15     while recv_size < num:  # 比较收到字节长度和本来长度进行比较
16         data += tcp_client.recv(102)  # 收到的字节进行拼接
17         recv_size = len(data)  # 计算收到字节的长度
18     print(data.decode('gbk'))  # 最后将收到的字节进行解码打印。

stuckt模块,可以直接将int整型直接变为字节

解决办法二:服务端

 1 from socket import *
 2 import subprocess
 3 import struct
 4 tcp_server = socket(AF_INET, SOCK_STREAM)
 5 tcp_server.bind(('127.0.0.1', 8080))
 6 tcp_server.listen(128)
 7 while True:
 8     print('等待新用户连接')
 9     coon, addr = tcp_server.accept()
10     print('新的客户端连接:', addr)
11     while True:
12         try:
13             cmd = coon.recv(1024)
14             print('执行的命令为', cmd.decode())
15             res = subprocess.Popen(cmd.decode(), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
16                                    stdin=subprocess.PIPE)
17             err = res.stderr.read()
18             if err:
19                 cmd_res = err
20             else:
21                 cmd_res = res.stdout.read()
22             if not cmd_res:
23                 cmd_res = '执行成功'.encode('GBK')
24             length = len(cmd_res)  # 计算字节的长度,长度为整型
25             # coon.send(str(length).encode())  # 将字节的长度发送给客户端,注意需将整型变为字符串后在转化为字节发送。
26             # coon.send(struct.pack('i',length))
27             length = struct.pack('i',length)
28             coon.send(length)
29             begin_start = coon.recv(1024)
30             if begin_start.decode() == '开始接收':
31                 coon.send(cmd_res)
32 
33         except Exception as f:
34             break
35 
36     coon.close()

客户端:

 1 from socket import *
 2 import struct
 3 tcp_client = socket(AF_INET, SOCK_STREAM)
 4 tcp_client.connect(('127.0.0.1', 8080))
 5 while True:
 6     cmd = input('请输入指令:').strip()
 7     if not cmd: continue
 8     if cmd == 'quit': break
 9     tcp_client.send(cmd.encode())
10     num = tcp_client.recv(1024)  # 收到的服务端发来的字节长度,注意此时为字节
11     tcp_client.send('开始接收'.encode())
12     # num = int(num.decode())  # 将字节变为字符串(此字符串为整型字符串),然后变为整型
13     num = struct.unpack('i',num)[0]
14     recv_size = 0
15     data = b''
16     while recv_size < num:  # 比较收到字节长度和本来长度进行比较
17         data += tcp_client.recv(102)  # 收到的字节进行拼接
18         recv_size = len(data)  # 计算收到字节的长度
19     print(data.decode('gbk'))  # 最后将收到的字节进行解码打印。

解决办法三,迭代器和偏函数公用:

迭代器和偏函数  如下:

 1 from functools import partial  # 偏函数
 2 
 3 
 4 def add(x, y):
 5     return x + y
 6 
 7 
 8 func = partial(add, 1)  # 偏函数可以固定一个函数的第一个值
 9 print(func(1))
10 print(func(5))
11 l = [1, 2, 3, 4, 5, 6]
12 
13 
14 def test():
15     return l.pop()
16 
17 
18 f = iter(test, 4)
19 print(f.__next__())
20 print(f.__next__())
21 print(f.__next__())

 待续

 

posted @ 2020-03-20 22:43  竹石2020  阅读(210)  评论(0编辑  收藏  举报