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()
原文地址:https://www.cnblogs.com/python-study/p/5790587.html