最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • websocket:后台flaks socketio以及socket-client前端的配合

    正文概述 掘金(Echo96)   2020-11-25   903

    前后端的交互问题

    http的单项传递

    ​ 最基本的协议,通常前段向后台发送,有get,post等等方法,现在前端上也有很多别的包可以用,axios等都可。但缺点在于它只能是前端向后端发起请求。

    双向信息传递

    暴力破解法:长短轮询

    暴力破解永远是最熟悉的方法——客户端向服务端隔一段时间发送http请求回后台,间隔时间长短决定了轮询的次数,不过由于每次发送http请求的时候报文头可能都会比内容多,所以轮询会有浪费带宽的坏处,但简单的点在于它实现起来没有任何技术上的压力。

    websocket:真正的双工实现

    比起暴力破解,websocket更加智能和优雅?(当然,是在做出来的前提下,没做出来,各种奇怪的错误更让人自闭

    websocket的机制

    websocket:后台flaks socketio以及socket-client前端的配合

    websocket首先会用http来进行连接,连接完成之后此项服务就会交给websocket来管理,之后就会建立长久的连接。

    websocket的js原生实现

    websocket的原生实现比较简单,这里用python来写后端代码,js来写前段代码(js用的es6的写法,这个是基于react框架,从中间截取出来)。

    import asyncio
    import websockets
    
    # 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
    async def recv_msg(websocket):
        while True:
            recv_text = await websocket.recv()
            response_text = f"your submit context: {recv_text}"
            await websocket.send(response_text)
    
    # 服务器端主逻辑
    # websocket和path是该函数被回调时自动传过来的,不需要自己传
    async def main_logic(websocket, path):
        await recv_msg(websocket)
    
    # 把ip换成自己本地的ip
    start_server = websockets.serve(main_logic, 'localhost', 5678)
    
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
    
    // 打开一个 web socket
    const ws = new WebSocket("ws://localhost:5678");
    
    // 连接建立后
    ws.onopen=()=>
    {
    	console.log("成功连接")
    }
    
    // 接收到服务器消息后,建立连接后会一直监听
    ws.onmessage=(e)=> 
    { 
        const received_msg = e.data;
        console.log("收到消息:"+received_msg);
    }
    
    //传递数据到服务器
    ws.send("msg")
    
    // 连接关闭后
    ws.onclose =()=>
    { 
        console.log("连接已关闭..."); 
    }
    

    这样的实现很简洁也很简单,对于前端来说,所有使用都在这上面做组合就可以了。

    websocket的实现:基于socket.io

    //使用方法
    
    //导入,采用es6的方法
    import io from 'socket.io-client'
    
    //连接后台 http://ip:port/namespace
    const socket = io("http://192.168.6.140:6888/test_conn")
    
    //监听事件,这个server_response并不是固定的,他是和后端成对的
    //如果前端监听 'server_response',他对应监听的消息就是后端socketio.emit('server_response','msg')
    socket.on('server_response',(data)=>{
        console.log(data)
        //传送标记为event的消息,后端监听socketio.on('event',namespace='/test_conn')
        socket.emit('event',"message")
    })
    

    踩坑记录----错误记录

    • Cannot read property 'sid' of undefined

      • 前段可以接受到后台发送的sid信息,但是在socktio解析过程中报错无法得到sid的信息

      • //network中获取的第一个消息
        0{"sid":"NWUwZWY4NzBiYjk1OQ==","upgrades":[],"pingInterval":44000,"pingTimeout":36000}
            
            
        //network的信息流
        server----------------------------client
        ----0{sid,upgrades,pinginterval...}---->
        <------------------{40}-----------------
        ------------------>{40}---------------->
        ------------------>{40}---------------->
        

        前段连接代码采用上面的引入import io from 'socket.io-client'不要用require('socket.io-client')

    • 后台报错http1.1 400或者http1.1 404

      • 后台socketio应该有

        socketio = SocketIO(app, async_mode=async_mode,cors_allowed_origins='*')
        

    起源地下载网 » websocket:后台flaks socketio以及socket-client前端的配合

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元