WebSocket的基础知识总结

1. 关于WebSocket

WebSocket是一种网络通信协议,很多高级功能都需要它。

(1)很多人在接触一项新技术的时候,都想知道我为什么要学习这门新技术,这门技术对于我处理当前的这个问题是必要的吗?
(2)以前有类似的技术吗,它和我过去熟悉的什么技术是一个类型的(这样便于进行类比理解和学习)?
(3)这门技术到底有什么特点或优点?
……

之所以有以上的这些疑问,也是站在我自己的角度提出的。当我面对一门新技术时,总是会在脑海里去提出很多问题,然后针对这些问题去寻找答案。当这些问题一一被解答后,那么我对于这门新的技术也就基本了解了,剩下的便是如何将它应用在项目实践中。

再好的技术,只有当你把它运用在项目中,发挥出别的技术无法取代的作用时,才算是真正掌握了这门技术。

下面我就针对以上提出的几个问题,来结合我的理解,回答一下。面对以上的这一系列的疑问,阮一峰老师在他的WebSocket教程中开门见山地便提到:

”初次接触WebSocket的人,都会问同样的问题:我们已经有了HTTP协议,为什么还需要另一个协议?它能带来什么好处?“

答案很简单,因为HTTP协议有一个缺陷:通信只能由客户端发起。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用”轮询(polling)”:每隔一段时间,就发出一个询问(request),了解服务器有没有新的信息。轮询的效率低,非常浪费资源(因为必须不停连接,或者HTTP连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。

WebSocket应运而生。

伴随着HTML5推出的WebSocket,真正实现了Web的实时通信,使B/S模式具备了C/S模式的实时通信能力。WebSocket的工作流程是这样的:
浏览器通过JavaScript向服务器发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小了很多。

这里写图片描述
图片来自:http://www.ruanyifeng.com/blog/2017/05/websocket.html

从以上的这段描述中,其实已经回答了以上提到的三个问题。
(1) WebSocket是可以实现由服务器主动向客户端推送消息的功能,而不需要依赖于来自客户端的请求,增加了服务器的主动性和灵活性;
(2)与WebSocket类似的协议就是HTTP了,HTTP的通信只能由客户端发起,而WebSocket的通信只需要客户端与服务器握手建立连接后,双方便可以平等地、无差别地相互传送信息了,直至任意一方主动断开连接结束;
(3)WebSocket由于依赖的是TCP协议,因此在连接建立后,传输数据量比依赖于HTTP的传输数据量要小,提高了传输的效率。

2. Java实现WebSocket服务器

2.1 Java实现WebSocket服务器的注意事项:

基于Java可以搭建基本的WebSocket服务器。具体的实例可以参考以下链接中的步骤进行。
http://www.cnblogs.com/xdp-gacl/p/5193279.html

我已经按照这个链接中的步骤搭建起了基本的WebSocket服务器。
我搭建时用的环境是:
jdk: 1.8.0_131;
Tomcat: 8.0.29.

以下是我将上述博客中提供的工程导入到我的Eclipse后的目录结构截图。主要的文件是WebSocketTest.java文件。这个文件头部通过 @ServerEndpoint,将该类定义为了一个WebSocket的服务器。

@ServerEndpoint(“/websocket”)
@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,注解的值(在这里是”/websocket”)将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。

这里写图片描述

后来我把它部署在了Tomcat7.0.29版本的服务器上,服务器端口为8080。然后我在客户端用一个javaScript去连接WebSocket服务器。

和原来的例子中不同的是,例子中是用index.jsp,而我是写了一个ws-test.html文件,内部的JavaScript和jsp文件里的相同。

我的ws-test.html文件中连接Websocket服务器的连接串为:
websocket = new WebSocket(“ws://localhost:8080/websocket”);

结果,当我将我写的html文件在本地用Chrome或Firefox浏览器打开时,总是提示WebSocket shakehand失败,服务器返回404的错误。

最后经过网上查找,最终找到了解决方案。上述请求失败原因有两个,一是我的Tomcat版本过低,Tomcat7.0版本还不支持@ServerEndpoint的注解方式,二是我的连接websocket服务器的url地址不正确,应该增加我工程的项目名才可以正确的连接。因为我的工程名是JavaWebSocket,所以最终我的连接串为:
url = “ws://localhost:8080/JavaWebSocket/websocket”

2.2 测试结果:

由于WebSocket服务器是支持多点推送的,因此测试时,可以同时打开多个浏览器作为客户端。我在测试的时候同时打开了4个客户端,2个用Firefox, 2个用Chrome.
这里写图片描述

这里写图片描述

当我在左上角的输入框中,输入“来自客户端1的消息”,并点击发送消息按钮后,在客户端1~4均显示了由Websocket在接收到由客户端1发送给它的消息,再由该服务器向之前连接过它的四个客户端发送这些信息。因此,可以看到这四个客户端显示同样的信息。

3. Node.js模拟WebSocket服务器

参考链接:
1. WebSocket教程,阮一峰
http://www.ruanyifeng.com/blog/2017/05/websocket.html
2. Java WebSocket教程
http://colobu.com/2015/02/27/WebSockets-tutorial-on-Wildfly-8/
3. Java后端WebSocket的Tomcat实现
http://blog.chenzuhuang.com/archive/28.html
http://www.cnblogs.com/xdp-gacl/p/5193279.html

猜你喜欢

转载自blog.csdn.net/jiangnanqbey/article/details/81326085