对开始的时候我有点好奇为什么有了http协议还需要websocket呢?
因为http协议是无状态短链接一次请求一次响应的 只能客户端请求一次服务端发送一次结果,并不能服务端主动推送消息,所以websocket就应运而生了,websocket可以服务端主动的向客户端推送消息
- WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket 并不限于以 Ajax(或 XHR)方式通信,因为 Ajax 技术需要客户端发起请求,而 WebSocket 服务器和客户端可以彼此相互推送信息;XHR 受到域的限制,而 WebSocket 允许跨域通信。
websocket优点:
1、服务器与客户端之间交换的标头信息很小,大概只有 2 字节;
2、客户端与服务器都可以主动传送数据给对方;
3、不用频率创建 TCP 请求及销毁请求,减少网络带宽资源的占用,同时也节省服务器资源;
- tcp有三次握手 其实 websocket也是有我收到的就是在客户端建立连接访问的时候就有了握手,当new WebSocket建立的时候就产生了握手
ws = new WebSocket(ws_serv + "/toy/" + toy_id);
- python 的后端实现 websocket 的处理,有很多方法的。比较常见的是 gevent 的 websocket 的方式。
from flask import Flask, request
from geventwebsocket.websocket import WebSocket #导入WebSocket
from geventwebsocket.handler import WebSocketHandler #导入连接方式 它的通信连接
from gevent.pywsgi import WSGIServer #使用的连接方式
app = Flask(__name__)
@app.route("/toy/<tid>")
def toy(tid):
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket 获取你的连接对象
if user_socket:
user_socket_dict[tid] = user_socket
# { uid : websocket}
print(user_socket_dict)
if __name__ == '__main__':
http_serv = WSGIServer(("0.0.0.0", 9528), app, handler_class=WebSocketHandler)
http_serv.serve_forever()
client端:
ws = new WebSocket(ws_serv + "/toy/" + toy_id); # 建立与服务器webscocket的连接 就是握手环节
ws.onmessage = function (data) { //通过这个连接对象来对数据进行操作
.....
}
ws.onclose = function () {
window.location.reload();
}