python3.7对dubbo_telnet的do函数要求字节形式模拟dubbo控制台的命令
- 直接上代码tn.write函数 写入命令 需要以字节码形式,例如tn.write(b’\n’)
- 注释已经添加 方便阅读
def do(self, command):
# 连接Telnet服务器 链接linux服务器
try:
tn = telnetlib.Telnet(host=self.host, port=self.port, timeout=self.__connect_timeout)
except socket.error as err:
print("[host:%s port:%s] %s" % (self.host, self.port, err))
return err
try:
# 触发doubble提示符
tn.write(b'\n')
# 执行命令 read_until(expected, [timeout]) 一直读,知道出现了被期望的字符串,或者碰见超时(默认没有超时);可以阻塞
# 一直读直到出现了被期望的字符串,或者碰见超时(默认没有超时)可以阻塞
tn.read_until(b'%s'%(self.__finish.encode('gbk')), timeout=self.__read_timeout)
# 使用write方法向服务端传送命令
tn.write(b'%s\n' % (command.encode('gbk')))
# 获取结果
data = ''
while data.find(self.__finish) == -1:
# 读取所有已经排好队(在一个队列里)或者在套接字上的可用数据,没有阻塞
# print('[read_very_eager]:%s'%tn.read_very_eager())
data = tn.read_very_eager().decode('utf-8')
print('[data invoke result]:%s'%data)
# 原始data 会有resp+elapsed: 5 ms.+ dubbo> 需要'\n'分割并取出结果
list = data.split("\n")
# print('list:%s'%list)
data = list[0]
# 执行完毕后,终止Telnet连接(或输入exit退出)
tn.close()
return data
except Exception as e:
# data[1]输出cause异常出来 否则data会有字节码输出
print('[exception type]:%s;\n[data msg]:%s'%(e,data[1]))
return e