zoukankan      html  css  js  c++  java
  • Python CMD和粘包问题

    1.执行CMD命令

    SERVER:
    
    __author__ = 'Alex'
    #coding:utf-8
    import socket
    import subprocess
    
    ip_port = ('127.0.0.1',8888)
    sk = socket.socket()
    sk.bind(ip_port)
    sk.listen(5)
    print ("服务端启动...")
    
    while True:
        conn,addr = sk.accept()
        while True:
            try:
                recv_data = conn.recv(1024)
            except Exception:
                break
            print (str(recv_data,"utf8"))
            cmd = str(recv_data,"utf8").strip()
            cmd_call = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
            print (type(cmd_call))
            cmd_ret = cmd_call.stdout.read()
            print (type(cmd_ret))
            print (len(cmd_ret))
            if len(cmd_ret) == 0:
                cmd_ret = b'no output'
            conn.send(cmd_ret)
        conn.close()
    
    
    
    CLIENT:
    
    __author__ = 'Alex'
    #coding:utf-8
    import socket
    
    ip_port = ('127.0.0.1',8888)
    sk = socket.socket()
    sk.connect(ip_port)
    print ("客户端启动...")
    
    while True:
        send_data = input(">>>>>").strip()
        if len(send_data) == 0:
            continue
        if send_data == 'q':
            break
        sk.sendall(bytes(send_data,'gbk'))
        recv_data = sk.recv(1024)
        print (str(recv_data,"gbk"))
        if send_data =="exit":
            break
    sk.close()

    2.解决粘包问题,需要将传递过来的数据分成小块来接收

    SERVER:
    
    __author__ = 'Alex'
    #coding:utf-8
    import socket
    import subprocess
    ip_port = ('127.0.0.1',8899)
    sk = socket.socket()
    sk.bind(ip_port)
    sk.listen(5)
    print ("服务器启动...")
    
    while True:
        conn,addr = sk.accept()
    
        while True:
    
            recv_data = conn.recv(1024)
            print (str(recv_data,"utf8"))
    
            cmd = str(recv_data,"utf8")
            ret_cmd = subprocess.getoutput(cmd)
            ret_cmd_bytes = bytes(ret_cmd,"utf8")
            ret_size = len(ret_cmd_bytes)
            print (ret_size)
            conn.sendall(bytes(str(ret_size),"utf8"))
            conn.recv(1024)
            conn.sendall(bytes(ret_cmd,"utf8"))
    
        conn.close()
    
    
    
    CLIENT:
    
    __author__ = 'Alex'
    #coding:utf-8
    import socket
    ip_port = ('127.0.0.1',8899)
    sk = socket.socket()
    sk.connect(ip_port)
    
    while True:
    
        send_data = input(">>>>>")
        sk.sendall(bytes(send_data,"utf8"))
        if send_data == 'exit':
                break
    
        recv_data = sk.recv(1024)
        recv_size = int(str(recv_data,"utf8"))
        print (recv_size)
        sk.send(bytes('ok','utf8'))
        cmd_received_size=0      #已经获取到的返回值结果的大小是多少
        cmd_ret_bytes=bytes()    #已经获取到的返回值的bytes类型结果
        while cmd_received_size < recv_size:
            fetched_bytes = sk.recv(1024)
            cmd_received_size += len(fetched_bytes)
            cmd_ret_bytes += fetched_bytes
        cmd_result=str(cmd_ret_bytes,"utf8")
        print(cmd_result)
    sk.close()
  • 相关阅读:
    hdu 1348【凸包模板】
    hdu 3007【最小圆覆盖-随机增量法模板】
    poj 2187【旋转卡壳模板】
    bzoj 2618【半平面交模板】
    hdu1115【多边形求重心模板】
    bzoj 1006: [HNOI2008]神奇的国度【弦图+LesBFS】
    bzoj 3456: 城市规划【NTT+多项式求逆】
    bzoj 2194: 快速傅立叶之二【NTT】
    bzoj 4555: [Tjoi2016&Heoi2016]求和【NTT】
    bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/python-study/p/5790587.html
Copyright © 2011-2022 走看看