javanetty如何支持wss

Netty笔记之六:Netty对websocket的支持

WebSocket是一种规范,是Html5规范的一部分,websocket解决什么问题呢?解决http协议的一些不足。我们知道,http协议是一种无状态的,基于请求响应模式的协议。

网页聊天的程序(基于http协议的),浏览器客户端发送一个数据,服务器接收到这个浏览器数据之后,如何将数据推送给其他的浏览器客户端呢?

这就涉及到服务器的推技术。早年为了实现这种服务器也可以像浏览器客户端推送消息的长连接需求,有很多方案,比如说最常用的采用一种轮询技术,就是客户端每隔一段时间,比如说2s或者3s向服务器发送请求,去请求服务器端是否还有信息没有响应给客户端,有就响应给客户端,当然没有响应就只是一种无用的请求。

这种长轮询技术的缺点有:

1)响应数据不是实时的,在下一次轮询请求的时候才会得到这个响应信息,只能说是准实时,而不是严格意义的实时。

2)大多数轮询请求的空轮询,造成大量的资源带宽的浪费,每次http请求携带了大量无用的头信息,而服务器端其实大多数都不关注这些头信息,而实际大多数情况下这些头信息都远远大于body信息,造成了资源的消耗。

拓展

比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。

WebSocket一种在单个 TCP 连接上进行 全双工通讯 的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。WebSocket API也被W3C定为标准。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许 服务端主动向客户端推送数据 。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

websocket的出现就是解决了客户端与服务端的这种长连接问题,这种长连接是真正意义上的长连接。客户端与服务器一旦连接建立双方就是对等的实体,不再区分严格意义的客户端和服务端。长连接只有在初次建立的时候,客户端才会向服务端发送一些请求,这些请求包括请求头和请求体,一旦建立好连接之后,客户端和服务器只会发送数据本身而不需要再去发送请求头信息,这样大量减少了

网络带宽。websocket协议本身是构建在http协议之上的升级协议,客户端首先向服务器端去建立连接,这个连接本身就是http协议只是在头信息中包含了一些websocket协议的相关信息,一旦http连接建立之后,服务器端读到这些websocket协议的相关信息就将此协议升级成websocket协议。websocket协议也可以应用在非浏览器应用,只需要引入相关的websocket库就可以了。

HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如:

优点

浏览器页面向服务器发送消息,服务器将当前消息发送时间反馈给浏览器页面。

服务器端

服务器端初始化连接

WebSocketServerProtocolHandler :参数是访问路径,这边指定的是ws,服务客户端访问服务器的时候指定的url是: ws://www.easyaq.com:8899/ws 。

它负责websocket握手以及处理控制框架(Close,Ping(心跳检检测request),Pong(心跳检测响应))。 文本和二进制数据帧被传递到管道中的下一个处理程序进行处理。

桢 :

WebSocket规范中定义了6种类型的桢,netty为其提供了具体的对应的POJO实现。

WebSocketFrame:所有桢的父类,所谓桢就是WebSocket服务在建立的时候,在通道中处理的数据类型。本列子中客户端和服务器之间处理的是文本信息。所以范型参数是TextWebSocketFrame。

自定义Handler

页面 :

启动服务器,然后运行客户端页面,当客户端和服务器端连接建立的时候,服务器端执行 handlerAdded 回调方法,客户端执行 onopen 回调方法

服务器端控制台:

页面:

客户端发送消息,服务器端进行响应,

服务端控制台打印:

客户端也收到服务器端的响应:

打开开发者工具 :

在从标准的HTTP或者HTTPS协议切换到WebSocket时,将会使用一种升级握手的机制。因此,使用WebSocket的应用程序将始终以HTTP/S作为开始,然后再执行升级。这个升级动作发生的确定时刻特定与应用程序;它可能会发生在启动时候,也可能会发生在请求了某个特定的IURL之后。

参考技术

java web 服务器推送技术–comet4j

Comet:基于 HTTP 长连接的“服务器推”技术

javanetty如何支持wss

如何让java websocket服务端 支持wss

客户端:

client

1

2

3

4

5

6

7

!DOCTYPE html

html

body

h1WebSocket/h1

script src=”client.js”/script

/body

/html

client.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

var ws = new WebSocket(“ws://127.0.0.1:8080/”);

ws.onopen = function() {

alert(“Opened”);

ws.send(“I’m client”);

};

ws.onmessage = function (evt) {

alert(evt.data);

};

ws.onclose = function() {

alert(“Closed”);

};

ws.onerror = function(err) {

alert(“Error: ” + err);

};

服务端可以用各种语言去实现,Java可以用Jetty,C#可以用SuperSocket,这里我举例用Node.js,创建server.js:

var WebSocketServer = require(‘ws’).Server

, wss = new WebSocketServer({port: 8080});

wss.on(‘connection’, function(ws) {

ws.on(‘message’, function(message) {

console.log(‘received: %s’, message);

});

ws.send(‘something’);

});

运行方式:

1

2

npm install ws

node server.js

Websocket的netty实现

我们已经有了 HTTP 协议,为什么还需要另一个协议?

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

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

建立在 TCP 协议之上

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

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

SimpleChannelInboundHandler和ChannelInboundHandlerAdapter的区别,参看了这两个(

和 )

但还是没搞太明白

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月25日 03:38:46
下一篇 2024年3月25日 03:46:12

发表回复

登录后才能评论



关注微信