WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
特点
(1)建立在 TCP 协议之上,服务器端的实现比较容易。 (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 (3)数据格式比较轻量,性能开销小,通信高效。 (4)可以发送文本,也可以发送二进制数据,支持双向通信,实时性更强。 (5)没有同源限制,客户端可以与任意服务器通信。
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
WebSocket与HTTP协议的异同
相同点主要有:
都是基于TCP的应用层协议; 都使用Request/Response模型进行连接的建立; 在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码; 都可以在网络中传输数据。 不同点:
WS使用HTTP来建立连接,但是定义了一系列新的header域,这些域在HTTP中并不会使用; WS是HTML5中的协议,支持持久连接;而Http协议不支持持久连接。 WS的连接不能通过中间人来转发,它必须是一个直接连接; WS连接建立之后,通信双方都可以在任何时刻向另一方发送数据; WS连接建立之后,数据的传输使用帧来传递,不再需要Request消息; WS的数据帧有序。
代码示例
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
//websocket = new WebSocket("ws://192.168.1.58:8080/plant/servlet/PushMessage");
websocket = new WebSocket("ws://" + $("#webSocketIp").val() + ":" + $("#webSocketPort").val() + "/plant/servlet/PushMessage");
}
else {
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function () {
};
//连接成功建立的回调方法
websocket.onopen = function (event) {
};
//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
var message = eval("(" + event.data + ")");//转换后的JSON对象
// alert(obj.name);//json name
}
//连接关闭的回调方法
websocket.onclose = function () {
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
websocket.close();
}
//关闭连接
function closeWebSocket() {
websocket.close();
}