Python之websocket web模擬tail -F。
WebSocket是HTML5開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。WebSocket通信協議於2011年被IETF定為標準RFC 6455,WebSocketAPI被W3C定為標準。
在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向伺服器發出請求,然而HTTP request的header是非常長的,裡面包含的數據可能只是一個很小的值,這樣會佔用很多的帶寬和伺服器資源。
而比較新的技術去做輪詢的效果是Comet,使用了AJAX。但這種技術雖然可達到雙向通信,但依然需要發出請求,而且在Comet中,普遍採用了長鏈接,這也會大量消耗伺服器帶寬和資源。
面對這種狀況,HTML5定義了WebSocket協議,能更好的節省伺服器資源和帶寬並達到實時通訊。
以上內容是來自維基百科https://zh.wikipedia.org/wiki/WebSocket
tornado 實現動態日誌tail web展示,黃哥寫了一個原型,有需要的在上面修改和完善吧。
以下內容為黃哥Python培訓黃哥所寫,轉載請註明。三個文件,放在同一個目錄下。
再次聲明,這個是原型,請有需要的朋友完善之。
tailweb.py
# coding:utf-8nnimport timenimport sysnimport subprocessnimport tornado.ioloopnimport tornado.webnimport tornado.websocketnfrom tornado import gennfrom tornado.options import define, options, parse_command_linenndefine("port", default=8888, type=int)nnnclass IndexHandler(tornado.web.RequestHandler):nn def get(self):n title1 = n try:n title1 = self.get_argument("text1")n except:n self.render("index.html", textDiv="")n if title1:n self.render("index.html", textDiv="textDiv")nnnclass WebSocketHandler(tornado.websocket.WebSocketHandler):nn def open(self, *args):nn passnn def on_message(self, message):nn import timen from collections import dequenn def tail(filename, n=10):n Return the last n lines of a filen while True:n lines = <br>.join(list(deque(open(filename), n)))n self.write_message(lines)n if lines:n time.sleep(0.5)n continuen tail(ip.txt)nn def on_close(self):n print "Connection closed"nnnapp = tornado.web.Application([n (r/, IndexHandler),n (r/text1, IndexHandler),n (r/ws, WebSocketHandler),n])nnnif __name__ == __main__:n app.listen(options.port)n tornado.ioloop.IOLoop.instance().start()n
index.html
<!DOCTYPE html>n<html>nn<head>n <title>WebSockets Demonstrator For LFY</title>n</head>nn<body stylex="font-family: Lekton; font-size: 24pt">n <p stylex="width: 800px">日誌測試數據</p>n <!-- <div id="textDiv"></div> -->nn <form action="">nn <input type="hidden" name="text1" value="logfile" />nn <input type="submit" value="點擊" />n </div>n </form>nn <!-- <p stylex="width: 800px"><a href="./">點擊</a></p> -->nn {% if textDiv %}n <div id="textDiv"></div>nnn <script type="text/javascript">n var ws = new WebSocket("ws://127.0.0.1:8888/ws");nn ws.onopen = function() {n ws.send("Hello, world");n };n ws.onmessage = function(evt) {nn document.getElementById(textDiv).innerHTML = evt.data;nnnn };n </script>nn {% end %}nn</body>nnn</html>n
第三個文件ip.txt 放在當前目錄下,裡面放多個IP地址用來測試。
生成環境中,請修改成日誌文件路徑。
推薦閱讀:
※mac os x如何安裝python科學計算庫numpy?
※Python從零開始系列連載(1)——安裝環境
※Python 連接 MySQL 的幾種姿勢
※Python 設計模式初探
※Python中 __init__的通俗解釋?
TAG:Python |