WebSocket刨根问底(转)

WebSocket存在的意义

初期html的出现刚开始是静态的,无法进行交互,后来出现了JavaScript,一定程度上解决了该问题,JavaScript刚出现的时候不能和服务器端交互,直到Ajax出现。Ajax可以讲就是一个解决页面与服务器端进行交互的工具。而Ajax的所有请求都是必须由客户端发起的,服务器端进行响应。如果是服务器端有了新的消息,难以即时的发送到客户端。WebSocket技术出现之前,为了让客户端获取服务器端的数据,一般采用如下三种方案。

轮询

    这种方法最为简单,就是客户端在固定的时间间隔下(一般是1s)不停地向服务器端发出请求,查看客户端是否有最新的数据,服务器端如果有最新的数据则返回给客户端,如果没有则返回一个空的json或者xml文档。这种方式的实现很简单,但是弊端就是不停的发送无效请求,造成了服务器资源的浪费。

长连接

    长连接类似轮询,区别就是服务器端只有存在新数据时,才会响应客户端的请求,这样可以节约网络资源和服务器端资源,当然这种方法也存在一些问题:
    1.如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。
    2.TCP和HTTP规范中都有连接超时一说,所以所谓的长连接不能一直持续,服务器端和客户端的连接需要定期的连接和关闭再连接,当然也有一些技术能够延长每次连接的时间。

Applet和Flash

    Applet和flash的缺点:
    1.浏览器必须能够运行Java或者Flash
    2.无论是Applet还是Flash都存在安全问题
    3.随着HTML5在标准浏览器中广发支持,Flash下架已经被提上日程。(2020年停止支持)

WebSocket有哪些特点

webSocket可以实现全双工通信(服务器与浏览器之间)

HTTP/1.1的升级特性

    事实上,所有的HTTP客户端(浏览器、移动端等)都可以在请求头中包含Connection:Upgrade,这个表示客户端希望希望升级请求协议,那么是希望升级成什么样的呢?
    Http升级的最大的好处是最终使我们可以使用任意的协议,在升级握手完成之后,它就不再使用HTTP连接了,我们可以在升级握手完成之后建立一个Socket连接,理论上我们可以使用HTTP升级在两个端点之间使用任何自己设计的协议,进而创建出各种各样的TCP通信,当然浏览器不会让开发者随意去这么做,而是要指定某些协议,WebSocket应运而生。

使用HTTP/1.1升级的WebSocket协议

    一个WebSocket请求首先使用非正常的HTTP请求以特定的模式访问了一个URL,这个URL有两种模式,分别是ws和wss,对应的是HTTP协议中的http和https,请求头中除了Connection:Upgrade之外还有一个Upgrade:webSocket,它们两个将共同告诉服务器连接升级为WebSocket这样一个全双工协议。如此,在握手完成之后,文本消息或者其他二进制消息就可以同时在两个方向上进行发送,而不需要关闭和重建连接。此时的客户端与服务端其实是对等的,它们都可以互相主动发送消息。这里需要注意的是ws和wss模式并不能算作HTTP协议的一部分,以为HTTP请求和请求头并不包含URL模式,HTTP请求只在请求的第一行中包含相对于服务器的URL,在HOST头中包含域名,而WebSocket中特有的ws和wss模式主要用于通知浏览器和API是希望使用SSL/TLS(wss),还是希望使用不加密的方式(ws)进行连接。

WebSocket协议的优势

1.由于WebSocket连接在端口80(ws)或者443(wss)上创建,与HTTP使用的端口相同,这样,基本上所有的防火墙都不会阻塞WebSocket连接。
2.WebSocket使用HTTP协议进行握手,因此它可以自然而然的集成到网络浏览器和HTTP服务器中。
3.心跳消息(ping和pong)将被反复的发送,进而保持WebSocket连接几乎一直处于活跃状态。一个节点周期性的发送一个小数据包到另一个节点(ping),而另一个节点则使用包含了相同数据的数据包作为响应(pong),这样两个节点都将处于连接状态。
4.使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道。
5.WebSocket连接关闭时将发送一个特殊的关闭消息。
6.WebSocket支持跨域,可以避免Ajax的限制
7.HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用WebSocket时,当握手完成之后该限制就不存在了,因为此时的连接已经不再是HTTP连接了。

WebSocket协议的用途

    WebSocket协议的用途几乎是没有限制的:
    1.网页上的在线聊天
    2.多人在线游戏
    3.在线股票网站
    4.在线即时新闻网站
    5.高清视频流
    6.应用集群之间的通信
Java中处理WebSocket通信通常涉及到两个主要的部分:WebSocket客户端和服务器端。Java提供了多个库用于WebSocket开发,其中最常用的是Java WebSocket API(JSR 356)以及第三方库如Netty和Spring Websocket。 **1. Java WebSocket API (JSR 356)**: 这个API是Java官方推荐的标准,它定义了一套标准的API接口,如`javax.websocket.Endpoint`, `ServerEndpoint`, 和 `ClientEndpoint`。要在Java中创建一个WebSocket服务器,你需要实现`ServerEndpoint`接口,并在其中定义处理连接、消息发送和接收的方法。对于客户端,你可以创建一个`ClientEndpoint`实例并调用其方法连接到服务器。 **2. Netty**: Netty是一个高性能的异步事件驱动网络应用框架,也可以用于构建WebSocket服务器。它提供了一个易于使用的WebSocket模块,使得在Java中创建WebSocket服务变得简单。开发者可以通过`io.netty.handler.codec.http.websocketx`包中的类来实现WebSocket功能。 **3. Spring Websocket**: 如果你正在使用Spring框架,那么Spring Websocket是一个不错的选择。它提供了一组高内聚的API和注解,使WebSocket的集成变得方便。你可以创建`@ServerEndpoint`注解的类来作为WebSocket服务器,同时利用Spring的消息传递机制处理客户端通信。 WebSocket通常指的是当一个应用程序无法直接支持WebSocket协议时,会借助代理或适配器将HTTP请求换为WebSocket请求。例如,在Web容器环境中,可能由于限制或者为了兼容旧版浏览器,你可能会写一个Java中间件来作为HTTP和WebSocket之间的桥梁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值