正文
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
看一下方法及事件示例:
if ("WebSocket" in window) {
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9605");
// 通信发生错误
ws.onerror = function() {
alert("WebSocket连接发生错误");
}
// 成功打开连接通路
ws.onopen = function() {
alert("WebSocket连接成功");
ws.send("发送数据"); // 向服务器端发送数据
}
// 收到服务端数据
ws.onmessage = function(event) {
alert("收到服务端数据");
var received_msg = event.data; // 收到的服务端数据
}
// 连接关闭时触发
ws.onclose = function() {
alert("连接已关闭...");
}
// 监听窗口关闭事件,当窗口关闭时,主动关闭websocket连接,防止连接还没断开就关闭窗口server端抛异常
window.onbeforeunload = function () {
ws.close();
}
// 发送心跳包,一分钟一次
function heartBeat(){
ws.send('{"url":"/chat/heart-beat"}');
}
setInterval(heartBeat, 60000);
} else {
alert("您的浏览器不支持 WebSocket!");
}
这里基本把整个过程及处理都举出来了,多操作会有更深一层理解。
原生举例
js 原生举例:
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window) {
// 打开一个 web socket
var ws = new WebSocket("ws://192.168.0.23:9605");
// 通信发生错误
ws.onerror = function() {
alert("WebSocket连接发生错误");
}
// 成功打开连接通路
ws.onopen = function() {
// Web Socket 已连接上,进行相应处理,如使用 send() 方法向服务器端发送数据
ws.send("发送数据");
}
// 收到服务端数据
ws.onmessage = function(event) {
var received_msg = event.data; // 收到的服务端数据
}
// 连接关闭时触发
ws.onclose = function() {
// 关闭 websocket 可以是双向的,客户端可以关闭,服务端也可以关闭
alert("连接已关闭...");
}
// 监听窗口关闭事件,当窗口关闭时,主动关闭websocket连接,防止连接还没断开就关闭窗口server端抛异常
window.onbeforeunload = function () {
ws.close();
}
// 发送心跳包,一分钟一次
function heartBeat(){
ws.send('{"url":"/chat/heart-beat"}');
}
setInterval(heartBeat, 60000);
} else {
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">运行 WebSocket</a>
</div>
</body>
</html>
实例
下面举一个实际使用的例子:
if ( 'WebSocket' in window ) {
websocket = new WebSocket("ws://localhost:9998/echo");
} else {
alert('当前浏览器不支持websocket');
}
// 连接发生错误的回调方法
websocket.onerror = function () {
sweetAlert("WebSocket连接发生错误", "","error");
};
// 连接成功的回调方法
websocket.onopen = function () {
sweetAlert("WebSocket连接成功", "","success");
}
// 接收到消息的回调方法
websocket.onmessage = function (event) {
var data = JSON.parse( event.data );
switch ( data.event )
{
case 'CONNECT':
var clientId = data.response.client_id;
$.ajax({
type: 'GET',
url: '/socket/chat-uuid',
data: '',
dataType: 'json',
success: function( rs ) {
if ( rs.data.uuid ) {
var conMessage = '{"url":"/chat/online","chat_token":"abc","uuid":"'+ rs.data.uuid +'"}';
websocket.send(conMessage);
}
}
});
break;
case 'ONLINE':
$.ajax({
type: 'GET',
url: '/socket/get-msg',
data: '',
dataType: 'json',
success: function(rs) {
// 针对返回的操作
}
});
break;
case 'MSG':
// 一些针对MSG的操作
break;
default:
break;
}
}
// 连接关闭的回调方法
websocket.onclose = function () {
sweetAlert("WebSocket连接关闭", "","error");
}
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
}
// 关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
// 心跳包
function heartBeat() {
websocket.send('{"url":"/chat/heart-beat","chat_token":"abc"}');
}
setInterval( heartBeat, 60000 );
上面用到了SweetAlert。
参考资料
HTML5 WebSocket http://www.runoob.com/html/html5-websocket.html
The WebSocket Protocol https://tools.ietf.org/html/rfc6455
socket,tcp,http三者之间的区别和原理 https://www.jianshu.com/p/a24ba459e306
http://www.runoob.com/html/html5-websocket.html
http://www.ruanyifeng.com/blog/2017/05/websocket.html
http://mishengqiang.com/sweetalert/
WebSocket 协议 1~4 节 https://www.jianshu.com/p/867274a5e054
WebSocket 协议 5~10 节 https://www.jianshu.com/p/fc09b0899141
The WebSocket API (Windows) https://technet.microsoft.com/en-us/windows/hh673567(v=vs.60)
Window 对象 http://www.runoob.com/jsref/obj-window.html
WebSocket-技术探究 https://ibaiyang.github.io/blog/html/2018/05/25/WebSocket-技术探究.html
https://www.cnblogs.com/yingge/p/5998606.html
https://www.cnblogs.com/jiahuafu/p/4599959.html
Swoole学习 https://ibaiyang.github.io/blog/php/2018/05/26/PHP-Swoole%E5%AD%A6%E4%B9%A0.html
PHP Stream实现服务端 https://ibaiyang.github.io/blog/php/2018/06/04/PHP-Stream实现服务端.html
WebSocket 前世今生 https://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/
https://www.cnblogs.com/davidwang456/p/4786636.html
细说WebSocket - Node篇 https://www.cnblogs.com/hustskyking/p/websocket-with-node.html
看完让你彻底搞懂Websocket原理 https://blog.csdn.net/frank_good/article/details/50856585