1.什么是websocket?
websocket是H5提出的一个协议规范。websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一类似TCP的连接,从而方便C-S之间的通信。在websocket出现之前,web交互一直都是基于http协议的短连接或者长连接。
websocket协议本质上是一个基于tcp的协议,是先通过HTTP/HTTPS协议发起一条特殊的http请求进行握手后创建一个用于交换数据的TCP连接,此后服务端和客户端通过此TCP连接进行实时通信。所以不需要当心数据的稳定性和安全性。
以前webserver实现实时通信,靠的是轮询(polling),在特定的时间间隔内,由浏览器主动发送请求,将服务器的消息主动
拉回来,在这种情况下,我们需要不断的向服务器发送请求,然而HTPPRequest的header是非常长的,里面包含的数据可能只是一个
很小的值,这样会占用很多的带宽和服务器资源。最新的技术去做轮询的效果是Comet-用了AJAX。
这种技术虽然实现了全双工通信,但是依然需要发出request请求。websocketAPI最伟大之处在于服务器和客户端可以在给定的
时间范围内的任意时间,相互推送消息。浏览器和服务器只需要做一个握手的动作,在建立连接之后,服务器可以主动发送数据给
客户端,客户端也可以随时向服务器发送数据。此外,服务器和客户端之间交换的标头信息很小。websocket并不限于AJAX的方式通
信,因为ajax需要客户端发起请求,而websocket服务器和客户端可以彼此的相互推送消息。
2.websocket的作用?
webserver实现实时通信。以前为了实现实时的数据变化,靠的是轮询。由浏览器主动发送请求,将服务器的消息拉回来。但是这种情况,需要我们不断的请求服务器,然而HTTPRequest的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源。总结一句话websocket是服务器推出数据,以前都是客户端轮询来拉数据。
3.如何实现?
前端代码
<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(function () {
$('#connect_websocket').click(function () {
/*创建socket连接*/
var socket = new WebSocket("ws://localhost:8000/apps/websocket");
socket.onopen = function () {
console.log('WebSocket open');//成功连接上Websocket
};
socket.onmessage = function (e) {
console.log('message: ' + e.data);//打印出服务端返回过来的数据
$('#messagecontainer').prepend('<p>' + e.data + '</p>');
};
});
$('#send_message').click(function () {
window.s.send($('#message').val());//通过websocket发送数据
});
});
</script>
服务器:使用的是django中的dwebsocket
from dwebsocket import accept_websocket
@accept_websocket # 将请求导入到视图中
def websocket(request):
if not request.is_websocket(): # 判断是不是websocket连接
return Response({
'status': 'failing',
'message': str(),
'data': {},
}, 500)
else:
for message in request.websocket:
if not message:
type = None
else:
type = message.decode()
# 处理数据
while True:
# 发送消息到客户端
data = handle_data1(type)
send_message(request, data=data)
time.sleep(5)
def send_message(request, data):
request.websocket.send(data)
def handle_data1(type):
with open('/tmp/time.json') as f:
content = f.read()
# content = json.loads(content)
return content
然后不断修改文件time.json中的内容来看浏览器中返回的数据