因为现在使用Channels来实现啦,

这样就在Django的体系里自已弄完了。

方便后期代码维护和服务器部署。

这份土陋的东东,就放起来吧。

毕竟,通过读取文件来返回实时websocket,不适应于我的系统。

# coding:utf8
import tornado.ioloop
import tornado.web
import tornado.websocket
from tornado.ioloop import IOLoop
from datetime import timedelta
import time
import os
import sys
import tornado.httpserver

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    file_content = ""
    filename = "test.log"
    # 文件总大小,每次读取均更新长度
    f_size = 0
    # 每次读取的字节数,防止每次读得太多而卡死
    f_chunk = 1024
    # 文件读取指针位置
    f_pos = 0

    def check_origin(self, origin):
        return True

    def open(self):
        pass

    def update_client(self):
        self.write_message(self._read_file(self.filename))

    def on_message(self, message):
        self.filename = '-'.join(message.split('-')[1:])
        # 判断是否已存在LOG文件,如果没有,则先创建一个空文件内容
        if os.path.exists("/tmp/" + self.filename):
            self.update_client()
        else:
            with open("/tmp/" + self.filename, 'w') as f:
                f.write("empty file.....\n")

    def on_close(self):
        pass

    def _read_file(self, filename):
        '''
        f = open("/tmp/"+filename, "r")
        # seek里参数2是将指针放在末尾,检测文件长度
        f.seek(0, 2)
        self.f_size = f.tell()
        # 指针复位
        f.seek(self.f_pos, 0)
        # 判断文件长度是否大过单次读取字节
        if (self.f_size - self.f_pos) > self.f_chunk:
            ret_str = f.read(self.f_chunk)
            self.f_pos += self.f_chunk
            return ret_str
        else:
            # 如果(最后)一次可读取所有字节,则文件指针指到末尾,这是考虑可能下次再读时有新数据
            if self.f_size > self.f_pos:
                ret_str = f.read(self.f_size - self.f_pos)
                self.f_pos = self.f_size
                return ret_str
            elif self.f_size < self.f_pos:
                self.f_pos = 0
                return "reset"
            else:
                return ""
        f.close()
        '''
        with open("/tmp/"+filename) as f:
            content = f.read()
            if len(content) >= len(self.file_content):
                content_diff = content.replace(self.file_content, '')
                self.file_content = content
                return content_diff
            else:
                self.file_content = ""
                return "reset"

class IndexPageHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/ws_log/', IndexPageHandler),
            (r'/websocket/ws', WebSocketHandler)
        ]
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            debug=True
        )
        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == '__main__':
    ws_app = Application()
    server = tornado.httpserver.HTTPServer(ws_app)
    server.listen(9527)
    tornado.ioloop.IOLoop.instance().start()

不用的代码,存一份--用tornado实现的websocket的更多相关文章

  1. [翻译] Canvas 不用写代码的动画

    Canvas 不用写代码的动画 https://github.com/CanvasPod/Canvas Canvas is a project to simplify iOS development ...

  2. 不用写代码就能实现深度学习?手把手教你用英伟达 DIGITS 解决图像分类问题

    2006年,机器学习界泰斗Hinton,在Science上发表了一篇使用深度神经网络进行维数约简的论文 ,自此,神经网络再次走进人们的视野,进而引发了一场深度学习革命.深度学习之所以如此受关注,是因为 ...

  3. Codeforces Round #334(div.2)(新增不用二分代码) B

    B. More Cowbell time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. 不用写代码也能做表单 —— 加载meta即可

    做增删改查要写多少代码? 一个表单一套代码,十个表单十套代码吗? 我这么懒,怎么会写这么多代码? 我想做到:即使一百个表单也只需要一套代码(而且不需要复制粘贴).实现多个表单,只需要加载不同的meta ...

  5. 推荐一款最强Python自动化神器!再也不用写代码了!

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 搞过自动化测试的小伙伴,相信都知道,在Web自动化测试中,有一款自动化测试神器工具: seleniu ...

  6. 资源分享 | PyTea:不用运行代码,静态分析pytorch模型的错误

    ​  前言  ​​​​​​​本文介绍一个Pytorch模型的静态分析器 PyTea,它不需要运行代码,即可在几秒钟之内扫描分析出模型中的张量形状错误.文末附使用方法. 本文转载自机器之心 编辑:CV技 ...

  7. 如何添加商*通新对话快捷链接?不用js代码

    我们在使用商务通一般都是在页面中嵌入一段js代码,如果您是js洁癖,是不是在想着如何直接用一张小图加上商*通新对话链接来代替呢?好,那就一起来研究一下吧. 首先,我们打开一个有商*通js弹窗的页面,比 ...

  8. 使用StoryBoard设置Scrollview的横向滚动不用一行代码

    1).创建一个空工程Single类型的工程,然后打开故事版(StoryBoard)在ViewController上添加scrollview 2).然后对scrollview添加约束,上下左右全部都是0 ...

  9. 不用写代码的框架 - RobotFramework+Eclispe环境安装篇

    环境安装是学习任何一个新东西的第一步,这一步没走舒坦,那后面就没有心情走下去了. 引用名句:工欲善其事必先利其器!! Robotframework:一款 自动化测试框架. Eclipse:一款编辑工具 ...

随机推荐

  1. python 获取本机 IP

    原文 通过 UDP 获取本机 IP,目前见过最优雅的方法 这个方法是目前见过最优雅获取本机服务器的IP方法了.没有任何的依赖,也没有去猜测机器上的网络设备信息. 而且是利用 UDP 协议来实现的,生成 ...

  2. ElasticStack系列之十四 & ElasticSearch5.x bulk update 中重复 id 性能骤降

    目前在绝对多数公司在使用 ElasticSearch 将其当做数据库使用,将多个数据库中的数据同步到 ElasticSearch 索引是非常常见的应用场景.那么自然而然就会涉及到数据频繁的新增和更新, ...

  3. 1082 线段树练习 3 && 树状数组区间修改区间查询

    1082 线段树练习 3 题意: 给定序列初值, 要求支持区间修改, 区间查询 Solution 用树状数组, 代码量小, 空间占用小 巧用增量数组, 修改时在 \(l\) 处 $ + val$ , ...

  4. linux下常用的几个时间函数:time,gettimeofday,clock_gettime,_ftime

    time()提供了秒级的精确度 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒 ...

  5. 蓝桥杯 剪邮票 DFS (不错的题目)

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的 ...

  6. 【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)

    说明:很简单一个在HTTP模块中,而另外一个和HTTP 是并列的Stream模块(Nginx 1.9.0 支持) 一.两个模块的最简单配置如下 1.HTTP负载均衡: http { include m ...

  7. Android端抓取日志

    一.背景: ADT-Bundlee for Windows 是由GoogleAndroid官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决大 ...

  8. python学习笔记2-dict

    常用的dict操作: d={'name':'suki', ', 'sex':'man', 'addr':'nanjing' } #字典取值方便,但是字典是没有顺序的,List有下标 print(d[' ...

  9. C++ Rule of Three

    Rule of Three The rule of three (also known as the Law of The Big Three or The Big Three) is a rule ...

  10. R7—左右内全连接详解

    在SQL查询中,经常会用到左连接.右连接.内连接.全连接,那么在R中如何实现这些功能,今天来讲一讲! SQL回顾 原理 # 连接可分为以下几类: 内连接.(典型的连接运算,使用像   =   或   ...