您现在的位置是:网站首页>博客详情博客详情
原WebSocket的基础知识总结
凡繁烦2020-04-04 22:39【JAVA】5305人已围观
简介请将${source_id}替换成欲显示评论数的文章页的id。 请将${client_id}替换成您的APPID,APPID在后台-设置-通用设置-高级设置中获取。 Demo演示:
本文由Markdown语法编辑器编辑完成。
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
很赞哦! (0)
上一篇:css实现网页黑白效果
文章评论(共0条)
点击排行
标签云
站点信息
- 建站时间:2020-03-28
- 开发语言:JAVA
- 文章统计:13篇
- 文章评论:6条
- 统计数据:百度统计
- 微博:扫描二维码,关注

打赏本站
- 如果你觉得本站很棒,可以通过扫码支付打赏哦!
- 微信扫码:你说多少就多少~
- 支付宝:非常感谢您的慷慨支持~