Beispielcode für die Echtzeitprotokollanzeige von Python Tornado WebSocket

高洛峰
Freigeben: 2017-03-21 13:41:49
Original
1947 Leute haben es durchsucht

1. Thema: Echtzeitanzeige der vom Server dynamisch generierten Protokolldateien

2. Prozess:

 1. Client Browser Stellen Sie eine Websocket-Verbindung mit dem Server her, der Server legt auf, um die Link-Instanz zu speichern, und wartet auf neuen Inhalt, um die Rückgabeaktion auszulösen

 2. Das Protokollserverskript führt eine Schleife zur Erkennung aus neuer Inhalt, findet neue Zeilen und wartet auf Tornado API POST sendet neuen Inhalt

 3. Der Tornado-Prozessor empfängt den neuen Inhalt und gibt über Websocket eine neue Zeile an den gespeicherten Client-Link zurück

 4. Der Client-Browser empfängt den neuen Inhalt, die Änderung und die Anzeige

3. Code:

1. Tornado-Server-URLRoute, grundlegender Seitenhandler und HTML:

    #模块路径根据自身项目而定
    (r'/logs/index/',               'apps.logs.handler.IndexHandler'),
    (r'/logs/newlinesforcallbacker/',       'apps.logs.handler.WriteNewLinesHandler'),
    (r'/logs/newlinesforserver/',           'apps.logs.handler.ReceiveNewLinesHandler'),
Nach dem Login kopieren
class IndexHandler(BaseHandler):
    ''' 主页 '''
    def get(self, *args, **kwargs):
        self.render('logs/index.html')
Nach dem Login kopieren
<div align="center">
    <h2>this logs monitor</h2>
    <div style="width: 70%" id="main">
    <!-- 行展示 -->
    </div>
</div>
Nach dem Login kopieren

2. Serverseitiger Websocket-Handler (WriteNewLinesHandler), Linkverarbeitungsklasse und clientseitige Websocket-Anfrage-JS speichern und löschen

class ProStatus(object):
    &#39;&#39;&#39; 处理类 &#39;&#39;&#39;

    w_register = []

    def register(self, callbacker):
        &#39;&#39;&#39; 记录客户端连接实例 &#39;&#39;&#39;
        self.w_register.append(callbacker)

    def unregister(self, callbacker):
        &#39;&#39;&#39; 删除客户端连接实例 &#39;&#39;&#39;
        self.w_register.remove(callbacker)

    def makelines(self, lines):
        &#39;&#39;&#39; 处理接受的行内容 &#39;&#39;&#39;
        pass

    def trigger(self, line):
        &#39;&#39;&#39; 向所有被记录客户端发送最新内容 &#39;&#39;&#39;
       pass

class WriteNewLinesHandler(tornado.websocket.WebSocketHandler):
    &#39;&#39;&#39; 接受websocket链接,保存链接实例 &#39;&#39;&#39;
    def check_origin(self, origin):     #针对websocket处理类重写同源检查的方法
        return True

    def open(self):
        &#39;&#39;&#39; 处理新的连接  &#39;&#39;&#39;
        ProStatus().register(self)

    def on_close(self):
        ProStatus().unregister(self)  #删除客户端连接

    def on_message(self, message):
        pass
Nach dem Login kopieren
$(function(){
            function requestText(){
                host = "ws://" + location.hostname + ":" + location.port + "/logs/newlinesforcallbacker/"
                websocket = new WebSocket(host)

                websocket.onopen = function(evt){}      // 建立连接
                websocket.onmessage = function(evt){    // 获取服务器返回的信息
                    data = $.parseJSON(evt.data)
                    $("#main").append(data+"</br>")     //写入页面
                }
                websocket.onerror = function(evt){}
            }

            requestText()
})
Nach dem Login kopieren

3. Tornado wartet darauf, dass das Skript einen neuen Inhaltsverarbeitungshandler (ReceiveNewLinesHandler) übermittelt, sendet neuen Inhalt an den angehaltenen Client Funktion und durchläuft das Protokoll, um ein neues Inhaltsskript einzureichen

class ProStatus(object):
    &#39;&#39;&#39; 处理类 &#39;&#39;&#39;

    w_register = []

    def register(self, callbacker):
        &#39;&#39;&#39; 记录客户端连接实例 &#39;&#39;&#39;
        pass

    def unregister(self, callbacker):
        &#39;&#39;&#39; 删除客户端连接实例 &#39;&#39;&#39;
        pass

    def makelines(self, lines):
        &#39;&#39;&#39; 处理接受的行内容 &#39;&#39;&#39;
        for line in lines:
            self.trigger(line)

    def trigger(self, line):
        &#39;&#39;&#39; 向所有被记录客户端发送最新内容 &#39;&#39;&#39;
        for callabler in self.w_register:
            callabler.write_message(json.dumps(line))

class ReceiveNewLinesHandler(BaseHandler):
    &#39;&#39;&#39; 接受服务器端脚本提交的最新行内容 &#39;&#39;&#39;
    def post(self, *args, **kwargs):
        linesdata = self.get_argument(&#39;lines&#39;, &#39;&#39;)
        #print type(json.loads(linesdata))
        ProStatus().makelines(json.loads(linesdata))
Nach dem Login kopieren
#-*-coding:utf-8-*-
author = &#39;zhouwang&#39;
import time
import urllib
import urllib2
import json

p = 0
while True:
    f = open(&#39;logs.txt&#39;, &#39;r+&#39;)
    f.seek(p, 0)    #偏移到上次结束位置

    lines = f.readlines()

    if lines:
        #对行内容操作, 向服务器发送最新行内容
        data = urllib.urlencode({&#39;lines&#39;:json.dumps(lines)})
        url = &#39;http://localhost:8800/logs/newlinesforserver/&#39;
        req = urllib2.Request(url, data)
        res_data = urllib2.urlopen(req)
        #print res_data.read()

    #获取当前位置,作为偏移值
    p = f.tell()
    f.close()
    time.sleep(1)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonBeispielcode für die Echtzeitprotokollanzeige von Python Tornado WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!