无限循环无法连接到websocket服务器

无限循环无法连接到websocket服务器,websocket,tornado,Websocket,Tornado,客户端连接websocket并调用tail_log方法,而新客户端无法连接 如何解决这个问题 def on_message(self, message): def tail_log(user,ip,port,cmd,log_path,url): cmd = "/usr/bin/ssh -p {port} {user}@{ipaddr} {command} {logpath}" \ .format(user=user, ipaddr=ip, por

客户端连接websocket并调用tail_log方法,而新客户端无法连接

如何解决这个问题

def on_message(self, message):

    def tail_log(user,ip,port,cmd,log_path,url):
        cmd = "/usr/bin/ssh -p {port} {user}@{ipaddr} {command} {logpath}" \
            .format(user=user, ipaddr=ip, port=port, command=cmd, logpath=log_path)
        f = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

        while True:
            line = f.stdout.readline().strip()
            if line == '':
                self.write_message('failed')
                break
            self.write_message(line)

    tail_log(user=SSH_USER,ip=IP_ADDR,cmd=CMD,port=SSH_PORT,log_path=LOG_PATH,url=SOCKET_URL)

您的无限循环必须通过执行
yield
wait
,或通过从
tail\u log
函数返回,将控制权交还给Tornado的事件循环。由于无限循环不会将控制权交给事件循环,因此事件循环永远无法处理更多的事件,包括新的websocket连接

尝试使用异步读取子进程的标准输出。大概是这样的:

import tornado.ioloop
import tornado.process
import tornado.web
import tornado.websocket


class TailHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.write_message(u"Tailing....")
        self.p = tornado.process.Subprocess(
            "tail -f log.log",
            stdout=tornado.process.Subprocess.STREAM,
            stderr=tornado.process.Subprocess.STREAM,
            shell=True)

        tornado.ioloop.IOLoop.current().add_callback(
            lambda: self.tail(self.p.stdout))

        tornado.ioloop.IOLoop.current().add_callback(
            lambda: self.tail(self.p.stderr))

        self.p.set_exit_callback(self.close)

    async def tail(self, stream):
        try:
            while True:
                line = await stream.read_until(b'\n')
                if line:
                    self.write_message(line.decode('utf-8'))
                else:
                    # "tail" exited.
                    return
        except tornado.iostream.StreamClosedError:
            # Subprocess killed.
            pass
        finally:
            self.close()

    def on_close(self):
        # Client disconnected, kill the subprocess.
        self.p.proc.kill()


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("""<html><head><script>
        var ws = new WebSocket("ws://localhost:8888/tail");
ws.onmessage = function (evt) {
   document.write('<p>' + evt.data + '</p>');
};</script></head></html>""")


def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/tail", TailHandler),
    ])


app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
导入tornado.ioloop
导入tornado.process
导入tornado.web
导入tornado.websocket
类TailHandler(tornado.websocket.WebSocketHandler):
def打开(自):
自述信息(u“跟踪…”)
self.p=tornado.process.Subprocess(
“tail-f log.log”,
stdout=tornado.process.Subprocess.STREAM,
stderr=tornado.process.Subprocess.STREAM,
shell=True)
tornado.ioloop.ioloop.current().add\u回调(
lambda:self.tail(self.p.stdout))
tornado.ioloop.ioloop.current().add\u回调(
lambda:self.tail(self.p.stderr))
self.p.set\u exit\u回调(self.close)
异步定义尾部(自、流):
尝试:
尽管如此:
line=等待流。在(b'\n'之前读取\u)
如果行:
自写消息(行解码('utf-8'))
其他:
#“尾巴”退出了。
返回
除tornado.iostream.StreamClosedError外:
#子进程被终止。
通过
最后:
self.close()
def on_关闭(自身):
#客户端已断开连接,请终止子进程。
self.p.proc.kill()
类MainHandler(tornado.web.RequestHandler):
def get(自我):
self.write(“”)
var ws=newwebsocket(“ws://localhost:8888/tail”);
ws.onmessage=函数(evt){
document.write(''+evt.data+'

'); };""") def make_app(): return tornado.web.Application([ (r“/”,主处理器), (r“/尾”,尾处理装置), ]) app=make_app() app.listen(8888) tornado.ioloop.ioloop.current().start()

如果您还没有使用Python 3.5,请将@gen.coroutine替换为“async def”,将“yield”替换为“wait”,并将“break”替换为“return”。

谢谢,在我的代码中,实现在on message模块中,因为我的查询服务器内容是从客户端上传信息来确定的