zoukankan      html  css  js  c++  java
  • 粘包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__())

     待续

  • 相关阅读:
    ORA-01439: column to be modified must be empty to change datatype
    解决rhel相关系统下yum找不到安装包的解决方法
    oracle的function和procedure返回值给shell
    [摘] SQLPLUS Syntax
    Unix/Linux中shell调用sqlplus的方式
    sqlplus连接数据库的4种方式
    shell调用sqlplus批量执行sql文件
    shell自定义函数
    Java创建Oracle数据库表
    TCP的三次握手(建立连接)和四次挥手(关闭连接)
  • 原文地址:https://www.cnblogs.com/ch2020/p/12535496.html
Copyright © 2011-2022 走看看