参考:
- http://www.ruanyifeng.com/blog/2017/05/websocket.html
- https://socket.io/docs/client-api/#IO
- https://flask-socketio.readthedocs.io/en/latest/
流程
客服端发起连接 —–> 服务端 connect事件 连接 —–> 客户端 connect事件 反应。
send 和 emit区别,send只能在 message事件上接受,emit可以发给任何事件接收。
因此emit是首选。
客户端 socket
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/2.3.0/socket.io.js"></script> <script> var socket = io("ws://127.0.0.1:5000");
console.log(socket.id); console.log(socket.connected);
socket.on('connect', (evt) => { console.log(socket.id); console.log("connect", evt); console.log(socket.connected); socket.emit("onmessage", "hello,world") });
socket.on('disconnect', (evt) => { console.log("disconnect", evt); console.log(socket.connected); console.log(socket.disconnected); }); socket.on("onmessage", (evt) => { console.log("onmessage", evt); socket.send("gjjgjg"); socket.disconnect() }); socket.on("message", (evt) => { console.log("message", evt); }) window.onbeforeunload = () => { socket.close() } </script>
|
socket.id
字符串
套接字会话的唯一标识符。在connect
事件触发后设置,并在reconnect
事件后更新。
socket.connected
布尔值
套接字是否已连接到服务器。
socket.disconnected
布尔值
套接字是否与服务器断开连接。
socket.open()
手动重连
socket.connect()
同 ocket.open()
socket.on
1
| socket.on('news', (data) => { console.log(data);});// wit
|
socket.emit
1
| socket.emit('hello', 'world');
|
socket.send
socket.close()
手动关闭
socket.disconnect()
同 socket.close()
socket.compress(value)
压缩传输
设置用于后续事件发射的修饰符,以使事件数据仅在值为时才被压缩true
。默认为true
不调用该方法的时间。
1
| socket.compress(false).emit('an event', { some: 'data' });
|
socket.binary(value)
指定发出的数据是否包含二进制。指定时提高性能。可以是true
或false
。
1
| socket.binary(false).emit('一个事件',{ 一些:'数据' })
|
服务端
用很多没有介绍到的,可以查看文档进行学习。
普通socket
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
""" @Time : 2020/9/27 10:13 @File : main.py @author : dfkai @Software: PyCharm """ from flask import Flask from flask_socketio import SocketIO, emit, send
app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*")
@socketio.on("connect") def connect(msg=None): print("connect") print(msg)
@socketio.on("disconnect") def disconnect(msg=None): print("disconnect") print(msg)
@socketio.on("onmessage") def onmessage(msg=None): print("onmessage") print(msg) send({"data": "hell world"}) emit("onmessage", {"data": "hell world"})
@socketio.on("message") def message(msg=None): print("message") print(msg) send("googogogo")
if __name__ == '__main__': socketio.run(app, debug=True)
|
后台轮询任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
""" @Time : 2020/9/14 11:42 @File : back_socket.py @author : dfkai @Software: PyCharm """
from datetime import datetime
from flask import Flask from flask_socketio import SocketIO, emit
app = Flask(__name__) socketio = SocketIO(app)
thread_inspect = None thread_json = None
@socketio.on("connect") def handle_connect(): global thread_json, thread_inspect if thread_json is None: print("ine") thread_json = socketio.start_background_task(target=background_thread_for_json) if thread_inspect is None: thread_json = socketio.start_background_task(target=background_thread_for_inspect) emit("message", "hhhe")
def background_thread_for_json(): while True: socketio.sleep(10) now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") login_json = f"{now} models.get_login_for_socket()" arra_json = f"{now} models.get_arra_for_socket()" gather_json = f"{now} models.get_gather_for_socket()" re_msg_dict = { "login_json": login_json, "arra_json": arra_json, "gather_json": gather_json } socketio.emit("message", re_msg_dict, namespace="/abc")
def background_thread_for_inspect(): while True: socketio.sleep(10) now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") inspect_json = f"{now} models.get_inspect_for_socket()" re_msg_dict = { "inspect_json": inspect_json } socketio.emit("inspect", re_msg_dict, namespace="/abc")
if __name__ == '__main__': socketio.run(app)
|