翻看之前写的 Highcharts使用总结  和 前后台交互之传参方式,想对 WebSocket 单独写一个使用总结。

一、认识 WebSocket 。

WebSocket 是 H5 新出的一种协议,为解决客户端与服务端实时通信而产生的技术。

通过 HTTP/HTTPS 协议进行三次握手后创建一个用于交换数据的 TCP连接,此后服务端与客户端通过此 TCP 连接进行实时通信,任意时刻都可以相互推送消息,也允许跨域通信。(三.2)

比较:Ajax 轮询方式,客户端隔一段时间询问服务器,看是否有数据,是客户端主动请求的。

XHR 受到域的限制。

Long Poll 长轮询原理跟 Ajax 差不多,都是轮询方式,不过采取的是阻塞模型,即客户端发起连接后,如果没消息,就一直不返回Response给客户端,直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

二、简明入门。

1、创建一个新的 WebSocket 对象:

var Socket = new WebSocket(url,[protocal]);

参数解释: (1)url : 要连接的URL ; (2)[protocal] : 可选,指定一个服务器支持的协议。

2、WebSocket 属性:

(1) Socket.readyState —— readyState 代表 ReadOnly 属性的状态。

取值:0 —— 连接尚未建立;

1 —— 连接已经建立;

2 —— 连接正在关闭;

3 —— 连接已经关闭或不可用。

(2)Socket.bufferedAmount —— 读属性的 bufferedAmount 代表文本的字节数,utf-8 的排列使用 send() 方法。

3、WebSocket 事件:

事件 处理程序 说明
open Socket.onopen 发生在套接字建立连接
message Socket.onmessage 发生时客户端收到来自服务器的数据
error Socket.onerror 发生时有通信错误
close Socket.onclose 发生在连接关闭

4、WebSocket 方法:

(1)Socket.send() —— send(data) 方法用来连接传输数据;

(2)Socket.close() —— close()方法将被用于终止任何现有连接。

三、用法示例。

<a href="javascript:WebSocketTest()">点击运行WebSocket</a>
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert("WebSocket is supported by your Browser!");
// 打开WebSocket
var ws = new WebSocket("ws://127.0.0.1:2012");
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("121314");
alert("Message is sending");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("Message is received");
};
ws.onclose = function()
{
// websocket is closed
alert("Connection is closed");
};
} else {
// The browser doesn't support WebSocket
alert("WebSocket NOT supported by your Browser!!!");
}
}

四、项目实例。

项目用于物流仓库,管理仓库货架货位、货位灯、出库入库统计以及仓库实时温湿度统计显示。采用 WebSocket 和服务器连接,获取接口数据比较方便。

页面有显示“服务器状态”的红绿色圆形:

<div class="pull-right">
<span>服务器状态:</span>
<span id="wsServerStatus">未连接</span>
<div id="sx" style="width:12px;height:12px;border-radius:6px;background-color:red;" class="inline"></div>
</div>

红色代表“未连接”,绿色代表“连接”。

页面加载时建立连接:

<script>
var ws;
var SocketCreated = false; window.onload = function Connect() {
if (SocketCreated || (ws.readyState == 0 || ws.readyState == 1)) {
// readyState属性表示ReadOnly属性的状态。等于0或者1表示连接未建立
SocketCreated = false;
ws.close();
document.getElementById("wsServerStatus").innerHTML = "连接未建立";
document.getElementById("sx").style.background = "red";
} else {
document.getElementById("wsServerStatus").innerHTML = "准备连接到服务器 ...";
if ("WebSocket" in window) {
ws = new WebSocket("ws://192.168.1.108:2012");
}else if("MozWebSocket" in window) {
ws = new MozWebSocket("ws://192.168.1.108:2012");
}
SocketCreated = true;
ws.onopen = WSonOpen;
ws.onmessage = WSonMessage;
ws.onclose = WSonClose;
ws.onerror = WSonError;
}
}; function WSonOpen() {
document.getElementById("wsServerStatus").innerHTML = "连接已建立";
document.getElementById("sx").style.background = "green";
}; function WSonMessage(event) {
var msg = JSON.parse(event.data);
switch (msg.key) {
case "/device/data":
case "/device/status":
var n = document.getElementById("content-main").childElementCount;
for (var i = 1; i < n; i++) {
try{
var m = document.getElementById("content-main").children[i];
m.contentWindow.ParseValue(msg.body);
}catch(err){
alert("error:" + err);
}
}
break;
}
}; function WSonClose() {
document.getElementById("wsServerStatus").innerHTML = "连接已关闭";
document.getElementById("sx").style.background = "red";
}; function WSonError() {
document.getElementById("wsServerStatus").innerHTML = "远程连接中断";
document.getElementById("sx").style.background = "red";
}; function WsSend(val) {
ws.send(val);
} </script>

五、WebSocket 小应用——聊天室

因为这是去年做的一个小东西,当时的公司后台帮我写了个聊天服务器,所以可以正常使用这个聊天室,挺好玩的,可以相互发送消息,但是现在我这里只有前端的(⊙o⊙)…

<div class="talk_div">
<div id="skm_LockPane" class="LockOff"></div>
<header id="form1" runat="server">
<h2>聊天室</h2>
<h4>点击连接按钮,会通过WebSocket发起连接,进行会话</h4>
</header>
<div class="talk_container">
<form>
服务器地址:<input type="text" id="Connection"><br>
用&nbsp;户&nbsp;名:<input type="name" id="txtName">&nbsp;&nbsp;
<button id="ToggleConnection" type="button" onclick="ToggleConnectionClicked();">连接</button>
</form>
<div id="LogContainer" class="container"></div>
</div>
<footer id="SendDataContainer">
<input type="text" id="DataToSend" size="70">
<input type="button" id="SendData" value="发送" onclick="SendDataClicked();">
</footer>
</div>
var ws;
var SocketCreated = false;
var isUserloggedout = false; function lockOn(str) {
var lock = document.getElementById('skm_LockPane'); // id="skm_LockPane" 空idv
if (lock) // 如果变量lock
lock.className = 'LockOn';
lock.innerHTML = str;
} function lockOff() {
var lock = document.getElementById('skm_LockPane');
lock.className = 'LockOff';
} /* 点击 按钮 */
function ToggleConnectionClicked() {
if (SocketCreated && (ws.readyState == 0 || ws.readyState == 1)) {
//(SocketCreated = false)&&(连接未建立)。。。。readyState属性表示ReadOnly属性的状态。等于0或者1表示连接未建立
lockOn("离开聊天室..."); // lockOn 页面秒弹"离开聊天室..."
SocketCreated = false;
isUserloggedout = true;
ws.close();
} else {
lockOn("进入聊天室..."); // lockOn 页面秒弹"进入聊天室..."
Log("准备连接到服务器 ...");
try {
if ("WebSocket" in window) {
ws = new WebSocket("ws://" + document.getElementById("Connection").value);
}
else if ("MozWebSocket" in window) {
ws = new MozWebSocket("ws://" + document.getElementById("Connection").value);
}
SocketCreated = true;
isUserloggedout = false;
} catch (ex) {
Log(ex, "ERROR");
return;
}
document.getElementById("ToggleConnection").innerHTML = "断开";
ws.onopen = WSonOpen;
ws.onmessage = WSonMessage;
ws.onclose = WSonClose;
ws.onerror = WSonError;
}
}; function WSonOpen() {
lockOff();
Log("连接已建立!", "OK");
$("#SendDataContainer").show(); //输入框显现
console.log(1213); //控制台输出
}; function WSonMessage(event) {
Log(event.data);
}; function WSonClose() {
lockOff();
if (isUserloggedout)
Log("【" + document.getElementById("txtName").value + "】离开了聊天室!");
document.getElementById("ToggleConnection").innerHTML = "连接";
$("#SendDataContainer").hide();
}; function WSonError() {
lockOff();
Log("远程连接中断", "ERROR");
}; function SendDataClicked() {
if (document.getElementById("DataToSend").value.trim() != "") {
ws.send(document.getElementById("txtName").value + " 说:" + document.getElementById("DataToSend").value);
document.getElementById("DataToSend").value = "";
}
}; function Log(Text, MessageType) {
if (MessageType == "OK") Text = "<span style='color: green;'>" + Text + "</span>";
if (MessageType == "ERROR") Text = "<span style='color: red;'>" + Text + "</span>";
document.getElementById("LogContainer").innerHTML = document.getElementById("LogContainer").innerHTML + Text + "<br />";
var LogContainer = document.getElementById("LogContainer");
LogContainer.scrollTop = LogContainer.scrollHeight;
}; $(document).ready(function () {
$("#SendDataContainer").hide();
var WebSocketsExist = true;
try {
var dummy = new WebSocket("ws://192.168.1.201:2012");
} catch (ex) {
try {
webSocket = new MozWebSocket("ws://192.168.1.201:2012");
}
catch (ex) {
WebSocketsExist = false;
}
} if (WebSocketsExist) {
Log("您的浏览器支持WebSocket. 您可以尝试连接到聊天服务器!", "OK");
document.getElementById("Connection").value = "192.168.1.201:2012";
} else {
Log("您的浏览器不支持WebSocket。请选择其他的浏览器再尝试连接服务器。", "ERROR");
document.getElementById("ToggleConnection").disabled = true;
} $("#DataToSend").keypress(function (evt) {
if (evt.keyCode == 13) {
$("#SendData").click();
evt.preventDefault();
}
})
});

输入用户名之后点击按钮连接到服务器:

因为没有服务器可以连接,所以。。。。O(∩_∩)O哈哈~

在点击断开后,连接断开,用户离开:

前端后台都会的可以玩一下,我刚开始的时候觉得好好玩,一直在那发消息哈哈~

六、 WebSocket 其他 。

1、所谓的 TCP 连接,即三次握手,还记得在学校的时候期末考试这个必考,啊哈哈

过程:(1)客户端发送一个SYN包给服务器,然后等待应答。

(2)服务器端回应给客户端一个ACK=1、SYN=1的 TCP 数据段。

(3)客户必须再次回应服务器端一个ACK确认数据段。

2、WebSocket 和 Http 协议。

WebSocket 和 Http 协议都属于应用层协议。

关系:当 WebSocket 建立握手连接时,数据是通过 HTTP 协议传输的,在建立连接后,真正的数据传输不需要 HTTP 协议参与。

3、WebSocket Server (web 服务器)

调用开源库,如 PyWebSocket(python语言)、WebSocket-Node(js语言,建立在Node.js上)、LibWebSockets(c/c++语言)....他们实现了 WebSocket 数据包的封装和解析,调用这些接口即可。

JavaScript WebSocket 使用总结的更多相关文章

  1. javascript websocket 心跳检测机制介绍

    ====测试代码: ==index.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  2. 原创:Javascript Websocket客户端封装

    调试中,马马虎虎能用var LeesWebSocket = function (options) { this.defaults = { host: "127.0.0.1", po ...

  3. Javascript的websocket的使用方法

    javascript websocket接口 web实现客户端和服务端双向发送消息的方法有: 轮询,客户端定期向服务端请求: 长轮询,客户端定期向服务端请求,服务端只有有信息发送的时候才返回respo ...

  4. WebSocket实战之——JavaScript例子

    一.详细代码案例 详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读 ...

  5. WebSocket实战之JavaScript例子

    一.详细代码案例 详细解读一个简单html5 WebSocket的Js实例教程,附带完整的javascript websocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读 ...

  6. spring websocket源码分析

    什么是websocket? 摘录于wiki[1]: WebSocket is a protocol providing full-duplex communication channels over ...

  7. 反向Ajax,第2部分:WebSocket

    转自:http://kb.cnblogs.com/page/112616/ 前言 时至今日,用户期待的是可通过web访问快速.动态的应用.这一文章系列展示了如何使用反向Ajax(Reverse Aja ...

  8. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  9. WebSocket(2)---实现游戏公告功能

    实现游戏公告功能 实现功能:游戏管理里发布游戏公告,其它游戏玩家页面能够马上接受到游戏公告信息. 下面直接上代码案例,这里主要展示关键代码,底部有源码. 一.案例 1.pom.xml文件 主要是添加s ...

随机推荐

  1. Django+bootstrap+注册登录系统

    转自:https://www.cnblogs.com/robindong/p/9610057.html Robin_D 博客园 首页 新随笔 联系 订阅 管理 随笔 - 10  文章 - 0  评论 ...

  2. 如何写好demo——学习感悟

    文章标题:教你如何写好Demo应用 如何制作出最有用的demo呢? 简,易 在demo中,我们要专注于单一的主题.我们的教学覆盖了很大的知识范围,因此,化整为零是非常必要的. 例如,我们要说明Andr ...

  3. Nginx练习练习玩玩

    Date:2019-11-9 读前思考: 对于NGINX,一般会问什么? 面试官会从哪方面入手? 面试官到底想考察什么? 你做好准备了吗? 如果对于初学者,往往可以通过面试题来提升对某一个技术的了解和 ...

  4. Python函数式编程-map/reduce

    1.map map()传入的第一个参数是f,即函数对象本身. map()函数接收两个参数,一个是函数,一个是Interable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...

  5. k8s的pod的资源调度

    1.常用的预选策略 2.优选函数 3.节点亲和调度 3.1.节点硬亲和性 3.2.节点软亲和性 4.Pod资源亲和调度 4.1.Pod硬亲和度 4.2.Pod软亲和度 4.3.Pod反亲和度 5.污点 ...

  6. 【转】SENDING KEY VALUE MESSAGES WITH THE KAFKA CONSOLE PRODUCER

    SENDING KEY VALUE MESSAGES WITH THE KAFKA CONSOLE PRODUCER When working with Kafka you might find yo ...

  7. idea中tomcat的On Upate Action 与 On Frame Deactivation配置

    On Upate Action 与 On Frame Deactivation  这两个选项的设置,依赖于项目的部署方式 是war包 还是 exploded , 只讲exploded模式下的设置,因为 ...

  8. centos安装nodejs和配置npm

    1.下载安装nodejs 1 wget http://nodejs.org/dist/v7.4.0/node-v7.4.0.tar.gz 2 yum install gcc openssl-devel ...

  9. [0, 1] 区间内 n 次独立随机事件的一些问题

    问题一 证明:一根1米长的绳子,随机切成 $N$ 刀,变成($N+1$)根绳子,则最短的一根绳子长度的期望为 $\displaystyle \frac{1}{(N+1)^2}$. 证: 引理:当分成 ...

  10. post提交主订单数据(gateway)实现httpapi

    models.proto syntax = "proto3"; package services; import "google/protobuf/timestamp.p ...