执行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()