python flask 实现 websocket 服务器

好的,下面是 Python Flask 实现 WebSocket 服务器的详细代码:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@app.route('/')
def index():
    # 渲染模板
    return render_template('index.html')

@socketio.on('connect')
def test_connect():
    print('Client connected')

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')

@socketio.on('message')
def handle_message(msg):
    print('Received message: ' + msg)
    emit('message', msg, broadcast=True)

if __name__ == '__main__':
    socketio.run(app, debug=True)

在这个例子中,@socketio.on 装饰器用于处理 WebSocket 客户端发送的各种事件。

当客户端连接到服务器时,test_connect() 事件处理程序将被调用,并打印 ‘Client connected’。

当客户端断开连接时,test_disconnect() 事件处理程序将被调用,并打印’Client disconnected’。

当客户端发送消息时,handle_message() 事件处理程序将被调用,并打印接收到的消息。emit()函数用于向所有已连接的客户端广播消息。

在你的 HTML 模板中,你可以使用以下代码来连接到服务器:

<!doctype html>
<html>
  <head>
    <title>Flask Websocket Example</title>
  </head>
  <body>
    <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
    <script>
      document.addEventListener('DOMContentLoaded', function() {
        var socket = io.connect('http://' + document.domain + ':' + location.port);
        socket.on('connect', function() {
          console.log('Connected');
        });
        socket.on('message', function(data) {
          console.log(data);
        });
        socket.on('disconnect', function() {
          console.log('Disconnected');
        });
        document.querySelector('#send_button').onclick = function() {
          var message = document.querySelector('#message').value;
          socket.send(message);
        };
      });
    </script>
    <h1>Flask Websocket Example</h1>
    <input type="text" id="message">
    <button type="button" id="send_button">Send</button>
  </body>
</html>

在这个例子中,你可以使用 JavaScript 的 socket.io 客户端库创建一个 WebSocket 连接。在连接建立后,connect 事件将被调用,以及 messagedisconnect 事件将被调用。在点击 “Send” 按钮时,你会向服务器发送一条消息。

希望这个例子能帮助你实现自己的 Python Flask WebSocket 应用程序。

下面是带有邀请客户端连接的 Python Flask WebSocket 服务器实现:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit, send

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@app.route('/')
def index():
    # 渲染模板
    return render_template('index.html')

@socketio.on('connect')
def test_connect():
    print('Client connected')
    send('You are connected!', broadcast=False)

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')

@socketio.on('message')
def handle_message(msg):
    print('Received message: ' + msg)
    emit('message', msg, broadcast=True)

if __name__ == '__main__':
    socketio.run(app, debug=True)

在这里,我们添加了一个新的路由,使 WebSocket 服务器可以接受来自客户端的邀请连接:

@socketio.on('invite')
def handle_invite(url):
    # Extract the host and port from the URL
    host, port = url.split(':')
    port = int(port)
    # Connect to the new server using the URL
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        # Send a message to the new server
        s.sendall(b'Hello, new server!')

在这个事件处理程序中,我们使用 Python 的内置 socket 模块创建了一个新的套接字,然后使用 s.connect() 方法连接到客户端指定的主机和端口。最后,我们使用 s.sendall() 方法向新服务器发送一条消息。

最后,你可以在客户端使用以下代码连接到服务器:

var ws = new WebSocket('ws://' + window.location.host + '/myapp');

在这里,window.location.host 将提供客户端正在运行的服务器的 URL。请注意,我们使用 /myapp 路由与服务器通信。

同时,在客户端发送邀请的时候我们可以使用以下代码:

var url = '127.0.0.1:8081';
ws.send(JSON.stringify({
    'event': 'invite',
    'data': {
        'url': url
    }
}));

在这里,我们使用 WebSocket 连接的 send() 方法向服务器发送一个 JSON 格式的字符串,其中包含事件名称 invite 和设置推荐客户端 URL 的数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值