首页 > 其他 > 详细

粘包3

时间:2020-03-21 05:25:14      阅读:53      评论:0      收藏:0      [点我收藏+]

用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__())

 待续

 

粘包3

原文:https://www.cnblogs.com/ch2020/p/12535496.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!