WebSocket+Flask实现即时弹幕系统--开篇

自从过年开始就消沉到了开学,天天不知道在忙啥,稀里糊涂作点事情就睡觉了 开学了,想作一个东西--弹幕系统html

为何要作这个东西??

事情提及来有些尴尬.....上一次元旦晚会,工做室要出技术支持下晚会弹幕 上一届学长也没有留下他们具体的措施,就在网上找了下,某部门还要求关注公众号发弹幕 找到了某某微信墙,原本想懒省事,不在造轮子了,最后开场了才发现有人数限制..... 真的很气,回到寝室就决定在下次元旦以前搞出一个微信扫码的弹幕系统 之后应该也都是工做室出技术支持这个弹幕jquery

寒假因为工做室另几个网站要完善一下,而后过年以后也没作不少工做 这个想法,就耽搁到了如今,不着急,下次元旦还有很久.......git

大体的思路??

flow

在开学之初草草搞了下上图的大体流程,打算采用WebSocket和Flask结合 想的是想把基础的功能完成之后,再拓展其余方面,好比根据弹幕数权重抽奖等 整个流程主要是对弹幕内容的检测,没有危险内容就能够直接经过WebSocket即时发送到show页面 没有新消息的时候,取数据库中显示次数比较少的弹幕随机读出到屏幕github

其他就是后台的构建,以及与微信开发接口结合的部分 用户发送方面打算采用微信小程序的方式,给用户提供发送界面web

为何选择WebSocket和Flask??

浅显的一个实时性链接,延迟小,同时数据包头的修改,开销也很小等 并且发现它能够不考虑跨域,后来查到由于webSocket协议没有同源限制 (并且前些时候WebSocket很火,对于作弹幕这种东西实时性也正符合吧)算法

至于Flask,一开始作web开发就是用的这个框架,后来在Miguel Grinberg大神博客发现了Flask-SocketIO 哇,正符合我想要搞的这个东西,感受Flask完成这个东西仍是足以的数据库

目前简单的例子

文件布局

弹幕内容滚动部分,仍是不想造轮子了,用了yaseng/jquery.barrager.js 弹幕show页面就少了不少麻烦,目前模仿Flask-SocketIO官方文档完成基本发送模块小程序

//index.js文件监听index.html的发送事件
    var socket = io.connect();

    socket.on('connect', function () {
        socket.emit('connect_event', {
            data: encodeURI('链接成功!')
        });
    })

    $('form#emit').submit(function (event) {
        socket.emit('client_event', {
            data: encodeURI($('#emit_data').val())
        });
        return false;
    });

    //run.py中定义事件名并发送消息
    @newSocket.on('client_event')
	def client_msg(msg):
    	print(msg)
    	newSocket.emit('server_response', {'data': msg['data']})

	@newSocket.on('connect_event')
	def connected_msg(msg):
    	print(msg)
    	newSocket.emit('server_response', {'data': msg['data']})

    //show.js中监听response并根据弹幕滚动插件显示到屏幕
    var socket = io.connect();

    socket.on('server_response', function (msg) {
        var item = {
            img: 'static/images/haha.gif', //图片,微信接口受权后为用户头像
            info: decodeURI(msg.data), //文字
            close: true, //显示关闭按钮 
            speed: 12, //延迟,单位秒,默认6
            // bottom: 500, //距离底部高度,单位px,默认随机 
            // box_color: '', //气泡背景颜色,默认灰色
            // color: '#' + Math.floor(Math.random() * 0xffffff).toString(16), //颜色,默认粉红
            old_ie_color: '#000000', //ie低版兼容色,不能与网页背景相同,默认黑色 
        }
        $('body').barrager(item);
    });

效果

对于之后的几个思考??(之后来补或者写之后博客里)

  • 既然是弹幕系统,读取的时候是否是要作缓存?
  • 对于抽奖,根据弹幕数作权重进行随机的算法??(之前的那个项目实际意义上并非真正的权重随机)
  • 数据库查询方面,应该要作些优化,以及取数据的时候的一些循环和List的使用。
  • 微信小程序的未知迷坑.....

参考连接: 一些样式参考segmentfault

相关文章
相关标签/搜索