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()
  • 相关阅读:
    Hpuoj1039--【C语言训练】角谷猜想
    hpuoj--1093: 回文数(一)
    Zoj1628--Diamond(Dfs《暴力》)
    Poj1995--Raising Modulo Numbers(快速幂)
    杭电5137--How Many Maos Does the Guanxi Worth(Spfa+暴力枚举)
    杭电1166--敌兵布阵(线段树 | 树状数组)

    南阳5--Binary String Matching(Kmp)
    CGAL
    vs c++默认路径
  • 原文地址:https://www.cnblogs.com/python-study/p/5790587.html
Copyright © 2011-2022 走看看