一周复一周,时间过得飞快,每个周末都是很开心却又很彷徨。开心的是不用工作,彷徨的是自己这周学到了什么、自身的技能有没有提高、如何应对这个日新月异的社会...

  本周的工作的开发IM(即时聊天)模块,要用到的技术是WebSocket。由于刚接触WebSocket,自己也是边摸索边做...

1、Websocket是什么

  WebSocket是HTML5下一种新的协议,为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接,此后服务端与客户端通过此TCP连接进行实时通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。但是它和HTTP最大不同是:

WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

(1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为 wss),服务器网址就是 URL。

ws://example.com:80/some/path

2、Websocket的引用场景

  社交聊天、多玩家游戏、弹幕、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等,都需要高实时的场景。

3、客户端的简单实例

  WebSocket 的用法相当简单。

  下面是一个网页脚本的例子(点击这里看运行结果),基本上一眼就能明白。(例子连接不成功可能是网络代理等问题)

var ws = new WebSocket("wss://echo.websocket.org");

// 建立连接后的回调
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
}; // 收到服务端(websocket)消息后的回调
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
}; // 关闭连接后的回调函数 -- 断网不会触发这个事件!!!
ws.onclose = function(evt) {
console.log("Connection closed.");
};

4、WebSocket属性和方法

WebSocket 构造函数

  WebSocket 对象作为一个构造函数,用于新建 WebSocket 实例。

// 执行下面语句之后,客户端就会与服务器进行连接。
var ws = new WebSocket('ws://localhost:8080');

  实例对象的所有属性和方法清单,参见这里

4.1 WebSocket.readyState

  readyState属性返回实例对象的当前状态,共有四种。

CONNECTING:值为0,表示正在连接。
OPEN:值为1,表示连接成功,可以通信了。
CLOSING:值为2,表示连接正在关闭。
CLOSED:值为3,表示连接已经关闭,或者打开连接失败。

下面是一个示例。

switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}

4.2WebSocket.onopen

  实例对象的onopen属性,用于指定连接成功后的回调函数。

ws.onopen = function () {
ws.send('Hello Server!');
}

  如果要指定多个回调函数,可以使用addEventListener方法。

ws.addEventListener('open', function (event) {
ws.send('Hello Server!');
});

4.3 WebSocket.onclose

  实例对象的onclose属性,用于指定连接关闭后的回调函数。

ws.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
}; ws.addEventListener("close", function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
});

4.4 WebSocket.onmessage

  实例对象的onmessage属性,用于指定收到服务器数据后的回调函数。

ws.onmessage = function(event) {
var data = event.data;
// 处理数据
}; ws.addEventListener("message", function(event) {
var data = event.data;
// 处理数据
});

4.5 webSocket.send()

  实例对象的 send() 方法用于向服务器发送数据。

  发送文本的例子: ws.send('your message');

参考链接:

阮一峰WebSocket教程:

http://www.ruanyifeng.com/blog/2017/05/websocket.html

WebSocket实现IM:

http://www.fly63.com/article/detial/64

https://www.cnblogs.com/chunguang/p/5706376.html

WebSocket心跳机制:

https://www.cnblogs.com/tugenhua0707/p/8648044.html

周记1——WebSocket入门的更多相关文章

  1. Spring WebSocket初探2 (Spring WebSocket入门教程)<转>

    See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...

  2. WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室

    from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录]   WebSocket入门教程--大纲   [实例简介]   ...

  3. websocket入门案例(echo)

    websocket是用来干什么的,具体的请自行百度. 本文实现一个简单的websocket的入门小例子,实现客户端发送一句换,服务器端返回.即一个简单的交互. 一.服务器端的实现 1.创建一个类实现S ...

  4. Nodejs websocket入门

    websocket 2011年技术文档 http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/index.html 浏览器端接 ...

  5. WebSocket入门及示例

    前言 一直在想要不要写下这篇,因为网上关于websocket的介绍和使用的好文实在太多太多,例如有这篇和这篇. 但我不管了,写下来,这样我就不用在想使用的时候总是去翻写过的源码了. 先回答几个简单的问 ...

  6. Spring WebSocket初探1 (Spring WebSocket入门教程)<转>

    See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的de ...

  7. Netty学习第四节WebSocket入门

    1.什么是webSocket?       webSocket是H5提出的一个协议规范,webSocket约定了一个通信的规范,通过一个握手的机制,客户端和服务端,就能建立一个类似TCP的连接,从而方 ...

  8. webSocket入门

    原理:Pub-Sub(发布和订阅) 它适用于发送者将数据(发布者)发送给抽象数量的收件人(订阅者),而无需指定他们是谁. 1.是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 ...

  9. Spring WebSocket入门(二) 转载

    本文转载自:http://www.jianshu.com/p/8500ad65eb50 WebSocket前端准备 前端我们需要用到两个js文件:sockjs.js和stomp.js SockJS:S ...

随机推荐

  1. EFCore扩展Select方法(根据实体定制查询语句)

    EFCore扩展Select方法(根据实体定制查询语句)  通常用操作数据库的时候查询返回的字段是跟 我们的定义的实体是不一致的,所以往往针对UI或者接口层创建大量的Model, 而且需要手动对应字段 ...

  2. cinder侧卸载卷流程分析

    cinder侧卸载卷分析,存储类型以lvm+iscsi的方式为分析基础在虚机卸载卷的过程中,主要涉及如下三个函数1)cinder.volume.api.begin_detaching 把volume的 ...

  3. 《C#多线程编程实战》2.4 SemaphoreSlim

    这个简单多了. 理解也是很好理解. 比上一个mutex好理解多了. 这个SemaphoreSlim是干什么呢? 就是限制线程的来访问. 好比说一次只有两个,一次只有三个  这样的线程来访问资源. 有点 ...

  4. python 中如何判断list中是否包含某个元素

    在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 theList = ['a','b','c'] if 'a' in theList: print 'a in th ...

  5. 数据存储 mongodb

    数据存储 mongodb from pymongo import MongoClient import os base_dir = os.getcwd() class MongoPipeline(ob ...

  6. Codeforces Round #551 (Div. 2)A. Serval and Bus

    A. Serval and Bus time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  7. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  9. linux+python+robot+jenkins

    1.安装python 安装devtoolset # yum groupinstall “Development tools” 安装编译Python需要的包 # yum -y install zlib- ...

  10. 数据结构54:平衡二叉树(AVL树)

    上一节介绍如何使用二叉排序树实现动态查找表,本节介绍另外一种实现方式——平衡二叉树. 平衡二叉树,又称为 AVL 树.实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 ...