WebSocket是一种网络通信协议,可以实现服务端与客户端的双向通信,
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。
HTTP协议的话,只能由客户端发起通信,如果要获取服务端数据变化,只能通过“轮询”实现:每过一段时间发起一个询问,轮询的效率低,浪费资源,因为必须不停建立连接,或者保持HTTP 长连接。
服务端的实现方式有多种,本文用Flask-websocket实现。
下面贴上服务端代码:
import json
from flask import Flask, request, jsonify
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.exceptions import WebSocketError
app = Flask(__name__)
SOCKET_DIC = {}
# 接收请求参数sign,用来区分不同客户端请求
@app.route('/ws/file/<sign>')
def ws_socket(sign):
ws = request.environ.get('wsgi.websocket')
if not ws:
return '请求方式错误!'
while True:
msg = ws.receive()
if not msg:
ws.close()
try:
SOCKET_DIC.pop(sign)
except Exception as e:
pass
break
msg = eval(msg)
if isinstance(msg, list):
ws_dic = {
sign: ws
}
# 保存请求方信息,实现类似群聊功能
SOCKET_DIC.update(ws_dic)
else:
client = SOCKET_DIC.get(sign)
if not client:
ws.close()
try:
client.send(json.dumps(msg))
ws.send(json.dumps(msg))
except WebSocketError as e:
pass
SOCKET_DIC.pop(sign)
return 'success'
if __name__ == '__main__':
http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()
客户端新建一个WebSoket实例:
var ws = new WebSocket('ws://ip:port/ws/file/{sign}');
然后可以调用实例的各种方法属性,来监听、接收、发送消息等。
电脑和手机均与服务端建立起通信,服务端将手机端上传的图片转发给电脑端,就实现了简单的手机上传图片到电脑。依据这个思想,我们可以实现更多的功能。
网友评论