精华内容
下载资源
问答
  • FastAPI WebSocket 简单演示 一

    千次阅读 2020-08-20 00:18:45
    FastAPI WebSocket 简单演示 下午没事看了看WebSocket,感觉这个听好玩的,比写CRUD有意思。就复制了官网的demo演示看了看。 官方文档 效果

    FastAPI WebSocket 简单演示

    下午没事看了看WebSocket,感觉这个挺好玩的,比写CRUD有意思。就复制了官网的demo演示看了看。

    官方文档 https://fastapi.tiangolo.com/advanced/websockets/

    效果

    简单效果演示

    WebSocket 服务

    使用Python FastAPI框架官网demo

    from typing import List
    
    from fastapi import FastAPI, WebSocket, WebSocketDisconnect
    
    app = FastAPI()
    
    
    class ConnectionManager:
        def __init__(self):
            # 存放激活的ws连接对象
            self.active_connections: List[WebSocket] = []
    
        async def connect(self, ws: WebSocket):
            # 等待连接
            await ws.accept()
            # 存储ws连接对象
            self.active_connections.append(ws)
    
        def disconnect(self, ws: WebSocket):
            # 关闭时 移除ws对象
            self.active_connections.remove(ws)
    
        @staticmethod
        async def send_personal_message(message: str, ws: WebSocket):
            # 发送个人消息
            await ws.send_text(message)
    
        async def broadcast(self, message: str):
            # 广播消息
            for connection in self.active_connections:
                await connection.send_text(message)
    
    
    manager = ConnectionManager()
    
    
    @app.websocket("/ws/{user}")
    async def websocket_endpoint(websocket: WebSocket, user: str):
    
        await manager.connect(websocket)
    
        await manager.broadcast(f"用户{user}进入聊天室")
    
        try:
            while True:
                data = await websocket.receive_text()
                await manager.send_personal_message(f"你说了: {data}", websocket)
                await manager.broadcast(f"用户:{user} 说: {data}")
    
        except WebSocketDisconnect:
            manager.disconnect(websocket)
            await manager.broadcast(f"用户-{user}-离开")
    
    if __name__ == "__main__":
        import uvicorn
        # 官方推荐是用命令后启动 uvicorn main:app --host=127.0.0.1 --port=8010 --reload
        uvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)
    

    前端

    前端只是简单使用演示, 没有对连接做鉴权处理。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>聊天1</title>
    </head>
    <body>
    <h1>User1 Chat</h1>
    <form action="" onsubmit="sendMessage(event)">
        <input type="text" id="messageText" autocomplete="off"/>
        <button>Send</button>
    </form>
    <ul id='messages'>
    </ul>
    
    <script>
        var ws = new WebSocket("ws://127.0.0.1:8010/ws/user1");
    
        ws.onmessage = function(event) {
            var messages = document.getElementById('messages')
            var message = document.createElement('li')
            var content = document.createTextNode(event.data)
            message.appendChild(content)
            messages.appendChild(message)
        };
        function sendMessage(event) {
            var input = document.getElementById("messageText")
            ws.send(input.value)
            input.value = ''
            event.preventDefault()
        }
    </script>
    
    </body>
    </html>
    
    

    用户2, 和上面的用户1没什么区别,只是连接WebSocket 参数变化区分,
    其他地方一样,就是url参数变化了。

    <script>
        var ws = new WebSocket("ws://127.0.0.1:8010/ws/user2");
    
        ws.onmessage = function(event) {
            var messages = document.getElementById('messages')
            var message = document.createElement('li')
            var content = document.createTextNode(event.data)
            message.appendChild(content)
            messages.appendChild(message)
        };
        function sendMessage(event) {
            var input = document.getElementById("messageText")
            ws.send(input.value)
            input.value = ''
            event.preventDefault()
        }
    </script>
    
    

    总结

    WebSocket使用还是很简单的,但是封装鉴权,前端断线重连等等操作还是很耗时的。

    展开全文
  • Fastapi Websocket 简明使用 1.基于Fastapi 开发websocket 服务器端 2.基于Fastapi 开发websocket 客户端 环境 github python3.7 win10 依赖 pip install fastapi[all] websocket-client -i ...

    Fastapi Websocket 简明使用

    • 1.基于Fastapi 开发websocket 服务器端
    • 2.基于Fastapi 开发websocket 客户端
      在这里插入图片描述

    环境

    	 pip install fastapi[all] websocket-client -i https://pypi.doubanio.com/simple
    

    基于fastapi 实现 weboskcet

    • main.py
    from typing import List
    
    from fastapi import FastAPI, WebSocket, WebSocketDisconnect
    from fastapi.responses import HTMLResponse
    
    app = FastAPI()
    
    html = """
    <!DOCTYPE html>
    <html>
        <head>
            <title>Chat</title>
        </head>
        <body>
            <h1>WebSocket Chat</h1>
            <h2>Your ID: <span id="ws-id"></span></h2>
            <form action="" οnsubmit="sendMessage(event)">
                <input type="text" id="messageText" autocomplete="off"/>
                <button>Send</button>
            </form>
            <ul id='messages'>
            </ul>
            <script>
                var client_id = Date.now()
                document.querySelector("#ws-id").textContent = client_id;
                var ws = new WebSocket(`ws://192.168.144.81:8000/ws/${client_id}`);
                ws.onmessage = function(event) {
                    var messages = document.getElementById('messages')
                    var message = document.createElement('li')
                    var content = document.createTextNode(event.data)
                    message.appendChild(content)
                    messages.appendChild(message)
                };
                function sendMessage(event) {
                    var input = document.getElementById("messageText")
                    ws.send(input.value)
                    input.value = ''
                    event.preventDefault()
                }
            </script>
        </body>
    </html>
    """
    
    
    class ConnectionManager:
        def __init__(self):
            self.active_connections: List[WebSocket] = []
    
        async def connect(self, websocket: WebSocket):
            await websocket.accept()
            self.active_connections.append(websocket)
    
        def disconnect(self, websocket: WebSocket):
            self.active_connections.remove(websocket)
    
        async def send_personal_message(self, message: str, websocket: WebSocket):
            await websocket.send_text(message)
    
        async def broadcast(self, message: str):
            for connection in self.active_connections:
                await connection.send_text(message)
    
    
    manager = ConnectionManager()
    
    
    @app.get("/")
    async def get():
        return HTMLResponse(html)
    
    
    @app.websocket("/ws/{client_id}")
    async def websocket_endpoint(websocket: WebSocket, client_id: int):
        await manager.connect(websocket)
        try:
            while True:
                data = await websocket.receive_text()
    
                await manager.send_personal_message(f"You wrote: {data}", websocket)
                await manager.broadcast(f"Client #{client_id} says: {data}")
        except WebSocketDisconnect:
            manager.disconnect(websocket)
            await manager.broadcast(f"Client #{client_id} left the chat")
    
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run(
            app='main:app', 
            host="0.0.0.0",
            log_level="debug", 
            port=8000,
            loop="asyncio",
            # workers=4,
        )
    
    • client.py
    from fastapi import FastAPI,BackgroundTasks
    from starlette.concurrency import run_in_threadpool
    def create_app():
        app = FastAPI()
        return app
    
    app = create_app()
    
    @app.on_event("startup")
    async def init_scheduler():
        from task import run
        run()
       
        
    
    if __name__ =='__main__':
        import uvicorn
        uvicorn.run(
            app='client:app', 
            host="0.0.0.0",
            log_level="debug", 
            port=8888,
            loop="asyncio",
            # workers=4,
        )
    
    • task.py
    import websocket
    import threading, time
    
    def on_close(ws):
    	'''
    		- websocket client 重试机制
    	'''
        print ("Retry : %s" % time.ctime())
        time.sleep(2)
        connect_websocket() # 每2s 重试一次
    def on_open(ws):
    	'''
    		- 当系统连接上后的提示
    	'''
        print('connection established')
    
    def on_message(wsapp, message):
    	'''
    		- 接收服务器websocket 发送来的消息
    	'''
        print(message)
    
    def connect_websocket():
    	'''
    		- 尝试连接websocket 服务器
    		- 并给该线程设置守护
    	'''
        ws = websocket.WebSocketApp(
            "ws://192.168.144.81:8000/ws/2323", 
            on_open = on_open, 
            on_close = on_close,
            cookie="chocolate",
            on_message=on_message
            )
        wst = threading.Thread(target=ws.run_forever)
        wst.daemon = True
        wst.start()
    
    def run():
    '''
    	- websocket 组件会跟随fastapi 主进程启动
    	- 客户端系统会每隔2s 尝试一次连接
    '''
        try:
            connect_websocket()
        except Exception as err:
            print(err)
            print("connect failed")
    

    在这里插入图片描述在这里插入图片描述

    展开全文
  • fastapi-websocket-broadcast 在 / 实现的熟悉的“聊天” websocket演示应用程序的。 与运行 uvicorn app:app 然后将浏览器指向 。 REST API文档在/docs端点下提供。 Websocket界面 来自服务器的数据是JSON,格式...
  • FastAPI WebSocket

    2020-10-20 17:30:42
    首先安装 websockets , 别...from fastapi import FastAPI, WebSocket, WebSocketDisconnect fastAPI 中的WebSocket也是基于websockets运行的 不安装websockets 前端报错:failed: Error during WebSocket handsha

    此篇文章参考:https://www.cnblogs.com/CharmCode/p/13552551.html

    首先安装 websockets , 别上来就按照文章一段操作如猛虎,回头一看二百舞
    from fastapi import FastAPI, WebSocket, WebSocketDisconnect
    fastAPI 中的WebSocket也是基于websockets运行的

    不安装websockets

    • 前端报错:failed: Error during WebSocket handshake: Unexpected response code: 400
    • 后端报错:WARNING: Unsupported upgrade request
    pip3 install websockets
    
    展开全文
  • 微信小程序 网络API Websocket wx.connectSocket(OBJECT) ​ 创建一个 WebSocket 连接;一个微信小程序同时只能有一个WebSocket连接,如果当前已存在一个WebSocket连接,会自动关闭该连接,并重新创建一个WebSocket...
  • c# webapi websocket 服务端消息发送 WebSocketForWebAPI:https://gitee.com/lycz/WebSocketForWebAPI 服务端发送消息,控制器代码 private readonly ClientWebSocket webSocket = new ClientWebSocket(); ...

    c# webapi websocket 服务端消息发送

    WebSocketForWebAPI:https://gitee.com/lycz/WebSocketForWebAPI

    服务端发送消息,控制器代码

    复制代码

    private readonly ClientWebSocket webSocket = new ClientWebSocket();
    private readonly CancellationToken _cancellation = new CancellationToken();
    
    
    [HttpPost]
    public async Task SendMsg(string msg)
    {
    await webSocket.ConnectAsync(new Uri("ws://localhost:56486/api/msg"), _cancellation);
    var sendBytes = Encoding.UTF8.GetBytes(msg);//发送的数据
    var bsend = new ArraySegment<byte>(sendBytes);
    await webSocket.SendAsync(bsend, WebSocketMessageType.Binary, true, _cancellation);
    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "1", _cancellation);
    webSocket.Dispose();
    }

    复制代码

     

    WebSocketForWebAPI代码

    后台:MsgApiController.cs

    复制代码

    [RoutePrefix("api/msg")]
    public class MsgApiController : ApiController
    {
        private static List<WebSocket> _sockets = new List<WebSocket>();
    
        [Route]
        [HttpGet]
        public HttpResponseMessage Connect()
        {
            HttpContext.Current.AcceptWebSocketRequest(ProcessRequest); //在服务器端接受Web Socket请求,传入的函数作为Web Socket的处理函数,待Web Socket建立后该函数会被调用,在该函数中可以对Web Socket进行消息收发
    
            return Request.CreateResponse(HttpStatusCode.SwitchingProtocols); //构造同意切换至Web Socket的Response.
        }
    
        public async Task ProcessRequest(AspNetWebSocketContext context)
        {
            var socket = context.WebSocket;//传入的context中有当前的web socket对象
            _sockets.Add(socket);//此处将web socket对象加入一个静态列表中
    
            //进入一个无限循环,当web socket close是循环结束
            while (true)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var receivedResult = await socket.ReceiveAsync(buffer, CancellationToken.None);//对web socket进行异步接收数据
                if (receivedResult.MessageType == WebSocketMessageType.Close)
                {
                    await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);//如果client发起close请求,对client进行ack
                    _sockets.Remove(socket);
                    break;
                }
    
                if (socket.State == System.Net.WebSockets.WebSocketState.Open)
                {
                    string recvMsg = Encoding.UTF8.GetString(buffer.Array, 0, receivedResult.Count);
                    var recvBytes = Encoding.UTF8.GetBytes(recvMsg);
                    var sendBuffer = new ArraySegment<byte>(buffer.Array);
                    foreach (var innerSocket in _sockets)//当接收到文本消息时,对当前服务器上所有web socket连接进行广播
                    {
                        if (innerSocket != socket)
                        {
                            await innerSocket.SendAsync(sendBuffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                }
            }
        }
    }

    复制代码

    前端:

    Msg.cshtml

    复制代码

    @{
        Layout = null;
    }
    <!DOCTYPE html>
    <html>
    <head>
        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
        <script>
            var webSocket;
    
            function sendSocketMsg() {
                var msg = $("#msg").val();
                webSocket.send(msg);
                showMsg(msg, "blue");
            }
    
            function openSocket() {
                if (webSocket != null && typeof (webSocket) != "undefined") {
                    closeSocket();
                }
                webSocket = new WebSocket("ws://" + location.hostname + ":" + location.port + "/api/msg");
                webSocket.onopen = function () {
                    showMsg("连接建立");
                }
                webSocket.onerror = function () {
                    showMsg("发生异常");
                }
    
                webSocket.onmessage = function (event) {
                    showMsg(event.data, "yellow");
                }
    
                webSocket.onclose = function () { showMsg("连接关闭"); }
            }
    
            function closeSocket() {
                if (webSocket != null && typeof (webSocket) != "undefined") {
                    webSocket.close();
                }
            }
    
            function showMsg(msg, type) {
                if (type === null || typeof (type) === "undefined") type = "gray";
                $("#show").append("<span class='" + type + "'>" + msg + "</span><br>");
            }
        </script>
        <style>
            #show {
                border: 1px solid #ff6a00;
                padding: 10px;
            }
    
            .blue {
                border: 1px solid #0094ff;
            }
    
            .yellow {
                margin-left: 300px;
                border: 1px solid #b6ff00;
            }
    
            .gray {
                font-size: 10px;
                border: 1px solid #a9a9a9;
            }
        </style>
    </head>
    <body>
    <button οnclick="openSocket()">建立连接</button>
    <button οnclick="closeSocket()">断开连接</button>
    <hr />
    <input type="text" id="msg" />
    <button οnclick="sendSocketMsg()">发送信息</button>
    <hr />
    <div id="show"></div>
    </body>
    </html>

    复制代码

     

    展开全文
  • namespace WebApiDemo.Controllers { public class SocketController : ApiController { //websocket列表,用于记录在线websocket链接 private static List<UserWebSocket> webSockets = new List(); [HttpGet] ...
  • WebSocket示例 该项目是通过引导的。 服务器 该服务器是使用FastAPI实现的。 首先,安装依赖项: pip install fastapi "uvicorn[standard]" 然后,运行它: uvicorn run:app 必须在localhost:8000中创建服务器。...
  • 该软件包旨在提供一个简单,可靠且通用的接口,以使用基于WebSocket API。 特征 封装请求/响应周期的承诺 订阅带有回调的更新 连接断开时自动重新连接(具有后退功能-多亏了 ) 重新连接时自动重新启动订阅 将请求...
  • 基于vs 2013 c# MVC API 使用websocket 的测试通过,代码简单,应该方便。。
  • 币安Binance API Websocket

    千次阅读 2018-11-08 18:19:00
    本文介绍币安Binance API Websocket General WSS information The base endpoint is:wss://stream.binance.com:9443 Streams can be access either in a single raw stream or a combined stream Raw streams are....
  • Binance REST和WebSocket API的包装。 同时使用promise和回调,并美化通常使用大量一个字母属性名称的binance API响应。 有关请求的API和参数的更多信息,请访问 用法/示例 const api = require ( 'binance' ) ; ...
  • WebSocket服务器上的Redis 介绍 基于websocket的redis发布订阅协议服务器 此服务在localhost上监听2000扩展 软件架构 服务端示例 客户端示例 安装教程 1.需要先安装redis redis默认监听6379扩展 2.安装依赖 yarn ...
  • 前端页面: <!... <... <head>...meta charset="UTF-8">...websocket</title> </head> <body> <h1>WebSocket Chat</h1> <input type="text" id="nickname" autocomplete="off
  • :high_voltage: :rolled-up_newspaper: FastAPI Websocket发布/订阅 通过Websockets的快速持久的发布/订阅通道。 创建在线实时发布/订阅多播的最简单方法。 支持并在Python> = 3.7上进行了测试 安装 :hammer_and_...
  • 用C#写的一个WebSocket后台,和两个客户端测试页面,IIS需要有WebSocket协议
  • 火币Huobi API Websocket

    千次阅读 2018-11-08 18:11:00
    本文介绍火币Huobi API Websocket WebSocket API简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器之间在单个 tcp 连接上的全双工通信,由服务器主动发送信息给客户端,减少了频繁的身份验证...
  • WebSocket协议入门:WebSocket API

    万次阅读 2020-04-15 17:24:00
    点击connect按钮,服务器代码显示 点击send按钮,浏览器发送数据,服务器回送... var wsServer = 'ws://192.168.189.155:9096/';ws代表websocket的意思。 https://www.cnblogs.com/fuqiang88/p/5956363.html ...
  • Binance Websocket示例 本地订单(现货) # Cache local orderbook and echo best price # btcusdt by default npm run orderbook # or provide the trading pair SYMBOL=bnbusdt npm run orderbook 竞价用户数据流...
  • 基于WebAPIwebsocket示例

    千次阅读 热门讨论 2018-12-20 20:59:57
    客户端JS代码: <!DOCTYPE html> <html> <head> <...websocket client</title> <script type="text/javascript"> //**************zzt**************** ...
  • 目录 1API分类 2REST,即Representational State Transfer(表现层状态转换) ...3WebSocket API 4应用层面区别 1API分类 API按照功能一般可以分为账户、交易、行情三类。 调用接口的方式有两种:RES...
  • 使用v2 Websocket API的库。 Deribit是一种现代的,快速的比特币衍生品交易所。 该库是Go的的端口。 如果您想尝试一下,请客气并使用我的会员链接 或给我小费! btc:3HmLfHJvrJuM48zHFY6HstUCxbuwV3dvxd eth...
  • websocket WebSocket 是什么原理?为什么可以实现持久连接? - Ovear的回答 - 知乎 项目的代码 react 版,可以看此 在 componentDidMount 把定时器生效 // 定时器 this.heartCheck(); 难点在于需求是两分钟刷新一次...
  • Binance REST 和 WebSocket API 的包装器。 使用承诺并美化通常使用大量单字母属性名称的币安 API 响应。 有关 API 和请求参数的更多信息,请访问 用法/示例 const api = require ( 'binance' ) ; const ...
  • REST APIWebSocket API区别

    千次阅读 2019-03-19 18:25:19
    交易所一般都会提供这两种类型的API. REST API:向服务器请求数据,然后...WebSocket API:与服务器建立一个连接,服务器上数据有任何变动,会实时推送到终端,便于高频操作。 . . . 2019-03-19 18:24:54写于上海 ...
  • WebSocket API详细解析

    千次阅读 2018-11-21 11:07:51
    WebSocket 是 HTML5 开始提供...在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。  在 WebSocket API 中,浏览器和服务器只需要做一个握手的动...
  • 以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持WebSocket,且不用单开端口 使用步骤: 1.在Startup.cs的Configure中启用WebSocket中间件 app....
  • FastAPI 的单元测试:https://www.cnblogs.com/poloyy/p/15354901.html 直接上代码 #!usr/bin/env python # -*- coding:utf-8 _*- """ # author: 小菠萝测试笔记 # blog: https://www.cnblogs.com/poloyy/ # time.....
  • 应用场景:前端页面发起一个websocket请求与后端进行实时通讯。后端监听某端口获取数据,将监听到的数据加工处理,通过websocket发送到前端。  这里只提供后台的处理方案仅供参考。 1.后端监听某端口,获取数据并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,247
精华内容 22,498
关键字:

apiwebsocket