版本:python3+
##服务端代码
#/usr/bin/env python#_*_coding:utf-8_*_#yehuifrom socket import *from time import ctimeimport osclass TimeOutCommand: ##shell命令超时退出,默认2秒 def command_timeout(self, command, timeout=2): import subprocess, datetime, time, signal self.cmd = command.split(" ") self.start = datetime.datetime.now() try: self.process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except FileNotFoundError: self.err = format("不存在的shell命令: %s" % ' '.join(self.cmd)) return self.err while self.process.poll() is None: time.sleep(0.2) self.now = datetime.datetime.now() if (self.now - self.start).seconds > timeout: os.kill(self.process.pid, signal.SIGKILL) os.waitpid(-1, os.WNOHANG) return None self.res = self.process.stdout.readlines() self.rn = ''.join(list(str(self.i.decode('utf8')) for self.i in self.res)) return self.rnclass SocketServer: def __init__(self): self.HOST = '' self.PORT = 9999 self.BUFSIZE = 1024 self.ADDR = (self.HOST, self.PORT) self.tcpSerSock = socket(AF_INET, SOCK_STREAM) self.tcpSerSock.bind(self.ADDR) self.tcpSerSock.listen(5) self.quit = False self.shutdown = False def wait_conection(self): while True: print('waiting for connection...') self.tcpCliSock, self.addr = self.tcpSerSock.accept() print('...connected from: ', self.addr) while True: self.data = self.tcpCliSock.recv(self.BUFSIZE) # data = data.decode('utf8') self.data = str(self.data, encoding='utf8') ##由于recv接收到的信息为二进制的bytes,所以需要将它转换成utf8字符串 if not self.data: break self.ss = '[%s] %s' % (ctime(), self.data) if self.data == 'bye':break #self.data = os.popen("%s" % self.data).read() self.data = TimeOutCommand().command_timeout(self.data) #self.data = format("这是服务端发出的信息 %s \n" % self.ss)+self.data self.tcpCliSock.send(self.data.encode('utf8')) print('Bye-bye: [%s: %d]' % (self.addr[0], self.addr[1])) self.tcpCliSock.close()if __name__ == '__main__': c = SocketServer() c.wait_conection()##客户端代码 #/usr/bin/env python#_*_coding:utf-8_*_#yehuifrom socket import *import readlineclass SocketClient: def __init__(self, host='localhost', port=9999, bufsize=1024): self.HOST = host self.PORT = port self.BUFSIZE = bufsize self.ADDR = (self.HOST, self.PORT) def client_connect(self): self.tcpCliSock = socket(AF_INET, SOCK_STREAM) self.tcpCliSock.connect(self.ADDR) while True: self.data = input('>') if not self.data: continue print('input data: [%s]' % self.data) self.tcpCliSock.send(self.data.encode('utf8')) self.rdata = self.tcpCliSock.recv(self.BUFSIZE) if not self.rdata: break print(self.rdata.decode('utf8')) if self.data == 'bye' or self.data == 'shutdown': break self.tcpCliSock.close()if __name__ == '__main__': c = SocketClient() c.client_connect()转载于:https://www.cnblogs.com/yehui/articles/9086963.html