欢迎访问宙启技术站
智能推送

使用Bottle框架实现Websocket功能的示例代码

发布时间:2023-12-23 23:56:52

Bottle是一个简单而快速的Python Web框架,它可以用于构建各种类型的Web应用程序。虽然Bottle本身不提供对Websocket的直接支持,但可以通过使用其WSGI接口来实现Websocket功能。

下面是一个使用Bottle框架实现Websocket功能的示例代码:

from bottle import Bottle, run, request
from gevent import pywsgi, sleep
from geventwebsocket import WebSocketError
from geventwebsocket.handler import WebSocketHandler

app = Bottle()

# 存储连接到服务器的所有Websocket客户端
websockets = []

@app.route('/websocket')
def handle_websocket():
    # 在这里处理Websocket连接请求
    ws = request.environ.get('wsgi.websocket')
    if not ws:
        # 如果不是Websocket请求,返回错误
        return "This route only supports Websocket connections."
    
    # 将新连接的Websocket客户端添加到列表中
    websockets.append(ws)
    
    while True:
        try:
            # 读取客户端发送的消息
            message = ws.receive()
            
            if message:
                # 将消息发送给所有连接到服务器的客户端
                for client in websockets:
                    client.send(message)
            else:
                # 如果客户端关闭连接,从列表中移除该客户端
                websockets.remove(ws)
                break
        
        except WebSocketError:
            # 如果出现WebSocketError异常,表示连接已经关闭或发生了错误,从列表中移除该客户端
            websockets.remove(ws)
            break

    return ''


if __name__ == '__main__':
    # 使用gevent的pywsgi模块启动服务器,并运行Bottle应用
    server = pywsgi.WSGIServer(('localhost', 8080), app, handler_class=WebSocketHandler)
    server.serve_forever()

上述示例代码创建一个Bottle应用并定义了一个路由/websocket来处理Websocket连接请求。在连接建立后,它会将客户端的WebSocket对象添加到websockets列表中,并进入一个无限循环中等待客户端发送消息。当有消息到达时,它会将该消息发送给所有连接到服务器的客户端。

如果客户端关闭连接或发生错误,它会从websockets列表中移除该客户端。

以下是一个使用这个示例代码的例子:

在命令行中执行以下命令以启动服务器:

python websocket_server.py

然后,你可以使用浏览器中的Javascript代码创建一个Websocket连接,并发送/接收消息。以下是一个使用Javascript的Websocket客户端的例子:

<!DOCTYPE html>
<html>
<head>
    <title>Websocket Example</title>
</head>
<body>
    <input type="text" id="message" placeholder="Enter a message"/>
    <button onclick="sendMessage()">Send</button>
    <div id="output"></div>

    <script>
        var ws = new WebSocket("ws://localhost:8080/websocket");
        ws.onopen = function () {
            console.log("Websocket connection established.");
        };
        ws.onmessage = function (event) {
            document.getElementById("output").innerHTML += event.data + "<br>";
        };

        function sendMessage() {
            var message = document.getElementById("message").value;
            ws.send(message);
        }
    </script>
</body>
</html>

在浏览器中打开上述HTML文件,它将与服务器建立一个Websocket连接。你可以在输入框中输入消息并点击发送按钮。发送的消息将通过Websocket连接发送到服务器,并由服务器转发给当前连接的所有客户端。服务器接收到的消息将显示在页面上的output div中。

这是一个简单的使用Bottle框架实现Websocket功能的示例。通过Bottle框架和gevent库的组合,可以方便地实现Websocket服务器和客户端的交互。