执行shell命令的单链接Socket

Server端:

import socket
import subprocess  #执行操作系统命令

host = ''
port = 8000

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(10)

while True:
    conn,addr=s.accept()
    print('Connect by',addr)

    while True:
        data = bytes.decode(conn.recv(1024))
        cmd_result = subprocess.check_output(data,shell=True)

        if len(cmd_result) == 0:
            conn.sendall(b'Done.')
        else:
            conn.sendall(cmd_result)

    conn.close()

Server端优化版

import socket
import subprocess
'''优化版本防止result大于1024,导致只能发送1024,而剩余部分无法发送。
  设计步骤:
   1.在发送数据前,统计并发送数据的字节大小。
   2.发送一次数据就统计一次数据大小,直到数据发送完成
'''

host = ''
port = 8000
buffersize = 1024  # 方便今后扩展
address = (host,port)   # 方便今后扩展

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(address)

while True:
    s.listen(10)
    conn,addr = s.accept()
    print('Connect by:',addr)

    while True:
        data = bytes.decode(conn.recv(buffersize))
        result = subprocess.check_output(data,shell=True)
        count = len(result)
        print('count:',count)
        conn.send(bytes(str(count),encoding='utf8'))
        while count > 0 :
            count2 = conn.send(result)
            count = count - count2
    conn.close()
s.close()

 

Client端:

import socket

host='127.0.0.1'
port=8000

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))

while True:
    cmd = bytes(input("Please input cmd:"),encoding='utf8')
    s.sendall(cmd)
    data = s.recv(1024)
    print(data.decode()) # 一定需要decode

s.close()

Client端优化版

import socket
'''
数据发送和接收要注意 encoding 和 decode
'''
host = '127.0.0.1'
port = 8000
address = (host,port) # 方便今后扩展
buffersize = 1024
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(address)

while True:
    data = bytes(input('Please input cmd:'),encoding='utf8')
    s.send(data)
    data_size = s.recv(buffersize)  # 接收数据大小
    print('data_size',data_size)
    data2 = b''
    while True:
        if int(data_size) == 0:
            print('Done!')
            break
        data3 = s.recv(buffersize)
        # print('data3',len(data3))  # 调试代码
        data2 = data2 + data3
        # print('data3',data3)  # 调试代码
        # print('len data3',len(data3))  # 调试代码
        if len(data2) >= int(data_size):
            break
    print(data2.decode())

s.close()

 

posted @ 2016-12-17 22:51  Vincen_shen  阅读(967)  评论(0)    收藏  举报