learn Websocket

参考:

  1. http://www.ruanyifeng.com/blog/2017/05/websocket.html
  2. https://socket.io/docs/client-api/#IO
  3. 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); //undefined
console.log(socket.connected); // false

socket.on('connect', (evt) => {
console.log(socket.id); //唯一id
console.log("connect", evt);
console.log(socket.connected); // true
socket.emit("onmessage", "hello,world")
});

socket.on('disconnect', (evt) => {
console.log("disconnect", evt);
console.log(socket.connected); // false
console.log(socket.disconnected); // false
});
socket.on("onmessage", (evt) => {
console.log("onmessage", evt);
socket.send("gjjgjg");
socket.disconnect()
});
socket.on("message", (evt) => {
// send 只能用在 message事件上
console.log("message", evt);
})
// 监听窗口事件,当窗口关闭时,主动断开websocket连接,防止连接没断开就关闭窗口,server端报错
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

1
socket.send('world');

socket.close()

手动关闭

socket.disconnect()

同 socket.close()

socket.compress(value)

压缩传输

  • value (布尔值)
  • 退货 Socket

设置用于后续事件发射的修饰符,以使事件数据仅在值为时才被压缩true。默认为true不调用该方法的时间。

1
socket.compress(false).emit('an event', { some: 'data' });

socket.binary(value)

指定发出的数据是否包含二进制。指定时提高性能。可以是truefalse

1
socket.binaryfalse).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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@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)
# emit("onmessage", {"data": "hell world"})


@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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@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)