kong中配置支持socketio

###websocket
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

###python websocket server实现

  1. socketio: flask_socketio
    1. 跨浏览器、跨平台,多种连接方式自动切换
    2. 功能完善,心跳检测,断线自动重连
    3. 使用方便,支持room和namespace;
    4. server和client必须配套使用,不能直接用原生WebSocket
  2. tornado_websocket
    1. 回掉方式,在异步化之后,并发处理能力应该不错,
    2. 因为是原生支持websocket而不像flask需要寻找第三方插件,所以可能更值得信赖
  3. dwebsocket

    没有用过, github上star 100多,比较少

flask_socketio实现

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
from flask import Flask, request, jsonify
from flask_socketio import SocketIO, rooms

app = Flask(__name__)
socketio = SocketIO(app)


def ack(data):
print('push msg success:{}'.format(data)) #增加推送成功回调


@app.route('/', methods=['POST'])
def active_ws():
r = request.form
print('push msg to:{}'.format(r.to_dict()))
socketio.emit('server_push', r.to_dict(), room=r.get('socket_id'),
namespace='/test', callback=ack)
return jsonify({'status': 'ok'})


@socketio.on('connect', namespace='/test')
def test_connect():
print('client connected websocket: {}'.format(*rooms()))


@socketio.on('disconnect', namespace='/test')
def test_disconnect():
print('close websocket: {}'.format(*rooms()))


if __name__ == '__main__':
socketio.run(app=app, port=9000)

kong中配置支持socketio

目前kong版本 1.3, 使用kong-dashboard v2;
增加api转发 注意upstream_url填ip, 否则可能报502;
增加cors插件,origins=* , Credentials=true;

socketio客户端连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script>
var socket = io.connect('ws://localhost:9000/test',
{
path: '/path/socket.io',
transport : ['websocket']
}
);
socket.on('connect', function () {
console.log(socket.id);
}, namespace='/wechat');

socket.on('server_push', function (data, ack) {
console.log(socket.id);
console.log(data);
ack({'socket_id': socket.id, 'status': 'ok'});
});
</script>