sanic 使用websocket与前端vue通信,持续发送信息

这篇具有很好参考价值的文章主要介绍了sanic 使用websocket与前端vue通信,持续发送信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前记

由于sanic使用较少,很难获取到有效信息,而且对websocket也是挺“一窍不通”的,因此写一下总结。在使用过程中,对sanic注册websocket,还是使用socketio不清。前端vue是使用io,还是WebSocket还是VueSocketIO。

直接使用sanic.add_websocket_route方法和使用python-socketio库的区别:

API:sanic.add_websocket_route是Sanic框架自带的一个方法,用于添加WebSocket路由。它基于WebSocket协议进行通信,并且提供了一些基本的事件回调函数。而python-socketio库是一个独立的Python库,提供了更多高级功能和选项,如房间管理、命名空间、广播等。

功能:sanic.add_websocket_route提供了基本的WebSocket功能,允许客户端与服务器进行双向实时通信。但它没有提供一些高级功能,如广播、房间管理等。python-socketio则提供了更多高级功能,使得开发者可以更方便地构建实时应用程序。

兼容性:sanic.add_websocket_route只支持原生WebSocket协议。而python-socketio库支持Socket.IO协议(包括WebSocket和轮询两种传输方式),并且可以与其他Socket.IO客户端库(如JavaScript版的Socket.IO)进行兼容。

总结来说,如果只需要简单的双向实时通信,则可以使用sanic.add_websocket_route方法;如果需要更多高级功能,并且希望与其他Socket.IO客户端库兼容,则可以考虑使用python-socketio库。

sanic自带的websocket连接

  • 当使用sanic.add_websocket_route方法建立了WebSocket路由后,前端vue可以通过WebSocket API与其建立连接。
  • 官方提供了一种注册websocket的方式,如下所示:
from sanic import Sanic
from sanic.response import json
from sanic.websocket import WebSocketProtocol

app = Sanic("websocket_example")

@app.websocket('/feed')
async def feed(request, ws):
    while True:
        data = 'hello!'
        print('Sending: ' + data)
        await ws.send(data)
        data = await ws.recv()
        print('Received: ' + data)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, protocol=WebSocketProtocol)
  • 也可以使用app.add_websocket_route()进行注册。
async def feed(request, ws):
    pass

app.add_websocket_route(feed, '/feed')
  • 但由于前端vue部分错误使用了io建立连接,导致失败。
  • 在网上搜到了以下代码作为demo,在控制台输入进行测试,发现可以连通,但是连接一次就关闭了。说明该方法是可以实现websocket连接的。
var ws = new WebSocket("ws://ip:port/ws/");
ws.onopen = function(evt) {
	console.log("Connection open ...");
	ws.send("Hello WebSockets!");
};
 
ws.onmessage = function(evt) {
	console.log("Received Message: " + evt.data);
	ws.close();
};
 
ws.onclose = function(e) {
	console.log("Connection closed.");
    console.log(e.code + ' ' + e.reason + ' ' + e.wasClean);
}

后端使用python-socketio

  • 由于之前使用过socketio,想在sanic中也进行使用。
  • 首先需要安装python-socketio
  • 可以通过API获取socketio.Client、socketio.AsyncServer具体参数的含义。
  • demo可进入网页示例。
pip install python-socketio
  • 以下代码结合demo及sanic框架。
from sanic import Sanic
import socketio

app = Sanic(__name__)
sio = socketio.AsyncServer(async_mode='sanic', cors_allowed_origins='*',)
sio.attach(app , socketio_path="/ws")
@sio.on("connect")
async def connect(sid, environ):
    print("connect ", sid)
	await sio.emit("message", "connecting")

# 以下为文档示例demo部分
async def index(request):
    """Serve the client-side application."""
    with open('index.html') as f:
        return web.Response(text=f.read(), content_type='text/html')

@sio.event
def connect(sid, environ):
    print("connect ", sid)

@sio.event
async def chat_message(sid, data):
    print("message ", data)

@sio.event
def disconnect(sid):
    print('disconnect ', sid)

app.router.add_static('/static', 'static')
app.router.add_get('/', index)

前端使用io建立连接

connectWebsocket: function (sessionId = null) {
  var wsURL = 'http://'+'window.location.host:'+'port' //该为示例,需自己修改port
  this.websocket = io(wsURL, {
    path: "/ws",
    transports: ['websocket'],
    query: {sessionId: "xxx"},
  })
  this.websocket.on('message', this.receiveWebsocketMessage)  // 从sio.emit("message", xxx)接受到的message的会展示
},
receiveWebsocketMessage: function (msg) {
    console.log("websocket message", msg)
},

前端使用websocket接收

  • 以下代码来自chat,真假未验证,可参照sanic 部分的前端代码。
javascript
// 在vue组件中使用WebSocket连接
export default {
  data() {
    return {
      socket: null,
    }
  },
  mounted() {
    // 创建WebSocket连接
    this.socket = new WebSocket('ws://localhost:8000/ws');
    
    // 监听连接建立事件
    this.socket.onopen = () => {
      console.log('WebSocket连接已建立');
      
      // 发送消息到服务器
      this.socket.send('Hello, server!');
    };
    
    // 监听收到消息事件
    this.socket.onmessage = (event) => {
      console.log('收到消息:', event.data);
      
      // 处理收到的消息
      // ...
    };
    
    // 监听连接关闭事件
    this.socket.onclose = () => {
      console.log('WebSocket连接已关闭');
      
      // 清理工作,如重新连接等
      // ...
    };
  },
}

前端使用VueSocketIO

import VueSocketIO from 'vue-socket.io';

Vue.use(new VueSocketIO({
  connection: 'http://localhost:3000'
}));
  • 可参考网址,写的注释太多了,漏掉了path及transports等是在options里面的。

引用

sanic文档
python实现Socket.IO
websocketio-API Reference
socketio-client demo
Vue中 引入使用 vue-socket.io文章来源地址https://www.toymoban.com/news/detail-514680.html

到了这里,关于sanic 使用websocket与前端vue通信,持续发送信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用WebSocket在前端发送消息

    在现代Web开发中,WebSocket提供了一种在用户的浏览器和服务器之间进行全双工通信的方法。这意味着服务器可以直接向客户端发送消息,而不需要客户端先请求数据。这种通信方式对于需要实时数据传输的应用(如在线游戏、实时通知系统等)非常有用。 WebSocket API 定义了一

    2024年04月26日
    浏览(37)
  • 前端使用websocket发送消息,建立连接(详细)。【前端】

    序言 今天来学习一下前端如何使用websocket发送消息 1.1 什么是WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时的双向通信。与传统的 HTTP 请求不同,WebSocket 使用了一个长连接,在客户端和服务器之间保持持久的连接,从

    2024年02月04日
    浏览(42)
  • 前端实现websocket通信讲解(vue2框架)

    前言 :最近接到的需求是前端需要实现一个全局告警弹窗,如果使用ajax请求http接口只能用定时器定时去请求是否有告警,这样既消耗资源,又不能实时监测到告警信息。所以这个时候就可以采用websocket来实现通信,因为websocket不用请求一次才响应一次,它可以实现服务器主

    2024年02月12日
    浏览(36)
  • 【WebSocket】前端使用WebSocket实时通信

    最近写项目,需要实现消息通知和实时聊天的功能,就去了解了一些关于websocket的知识,总结如下。 WebSocket 是一种在 Web 应用中实现实时通信的协议。与传统的 HTTP 请求不同,WebSocket 连接在客户端和服务器之间建立一个 持久性 的 双向通信管道 ,使得数据可以在连接打开后

    2024年02月11日
    浏览(33)
  • .Net6使用WebSocket与前端进行通信

    1. 创建类WebSocketTest: 2. 在program.cs中进行绑定 3. 使用websocket在线工具模拟请求:

    2024年02月03日
    浏览(48)
  • 使用vue3简单实现WebSocket通信

    关于WebSocket通信的简单介绍: 握手阶段:在建立WebSocket连接之前,客户端需要发送一个HTTP请求到服务器,请求升级为WebSocket协议。这个过程称为握手(Handshake)。如果服务器支持WebSocket协议,它将返回带有特定标头的HTTP响应,表示握手成功。 建立连接:客户端收到服务器的

    2024年02月16日
    浏览(37)
  • AI对话交互场景使用WebSocket建立H5客户端和服务端的信息实时双向通信

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许 服务端主动向客户端推送数据 。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HT

    2024年02月03日
    浏览(52)
  • Thinkphp5.0 安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端

    安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端,实现后端有数据更新时,前端页面自动更新数据。 我使用的是基于Thinkphp5.0的ThinkCMF5.0。 安装: 启动: public目录下放置的server.php文件,注意里面的配置必须按照你的Worker控制器来: woker控制器: 后端主动推

    2024年02月16日
    浏览(54)
  • 如何在前端实现WebSocket发送和接收TCP消息(多线程模式)

    当在前端实现WebSocket发送和接收TCP消息时,可以使用以下步骤来实现多线程模式。本文将详细介绍如何在前端实现WebSocket发送和接收TCP消息,并解释使用到的相关函数及原理。 在前端实现WebSocket发送和接收TCP消息的第一步是创建一个WebSocket连接。我们可以使用浏览器提供的

    2024年02月12日
    浏览(41)
  • 如何在前端实现WebSocket发送和接收UDP消息(多线程模式)

    本文将继续介绍如何在前端应用中利用WebSocket技术发送和接收UDP消息,并引入多线程模式来提高发送效率和性能。我们将使用JavaScript语言来编写代码,并结合WebSocket API、UDP数据包、Web Workers和UDP消息监听器来实现这一功能。 首先,我们需要在前端应用中建立一个WebSocket连接

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包