Netty实现WebSocket

专栏的上一篇主要描述了基于TCP方面封装好的Socket API实现CS之间相互联系、发送消息。

但是如果要是基于HTTP1.0,在HTTP1.0中,都是Client端向Server端去发送请求。但是Server回复给Client之后连接就会失效,也就无法做到基于HTTP1.0去实现聊天的这种需要长连接的功能,需要重新创建连接。

基于HTTP1.1,和HTTP1.0不同的地方就在于:断开连接的条件是指定一个时间就是所谓的Keep Alive,比如可以保证你在几分钟之内可以持续连接,过了这个时间之后就会断开连接。

Html5推出WebSocket之后真正意义上实现了CS长连接,虽然WebSocket也是基于HTTP但是会在Header中存放WebSocket特有的一些参数连接建立之后,这些参数会被识别出来,之后就可以实现双向的数据传递。

大多数情况下长连接也是对WebSocket做了封装,类似App、服务器会给你推送一些消息这就是WebSocket。

那么接下来就让用netty来实现聊天室功能。

WebSocket功能实现

首先先来实现服务端,MyServer的实现方式和专栏之前的文章都是相类似的。

二、实现过滤器的初始化操作
编解码的Handler是必须要有的,HTTP请求是在Netty经过的形式,在Netty的处理中HTTP请求是分块去传输的,虽说是分块同样也可以说是分大小进行传输的,后面还需要对这些分块的数据进行聚合。

因此以上提到的分块和聚合就是两个很重要的Handler操作,如下:
在这里插入图片描述
最后再加上我们自己定义的处理器,因为WebSocketServerProtocolHandler传输数据是以frame形式传递的,因此这里实现的Frame的字以WebSocketFrame的格式去进行服务端向Client完成消息的推送。
在这里插入图片描述
简单来说就是要符合WebSocket传输规范,在写几个回调方法:
在这里插入图片描述
因为我们实现的是WebSocket规范,因此我们要实现一个页面去帮我们实现HTTP请求:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>客户端</title>
</head>
<body>
<script type="text/javascript">

    var socket;

    if (window.WebSocket){
        socket = new WebSocket("ws://localhost:8899/ws");
        socket.onmessage = function (ev) {
            var ta = document.getElementById("repsonseTest");
            ta.value = ta.value + "\n" + ev.data;
        };
        socket.onopen = function (ev) {
            var ta = document.getElementById("reponseText");
            ta.value = "连接开启!";
        };
        socket.onclose = function (ev) {
            var ta = document.getElementById("reponseText");
            ta.value = ta.value + "\n" + "连接关闭!";
        };
    } else {
        alert("浏览器不支持WebSocket!")
    }

    function send(message) {
        if (!window.WebSocket) {
            return;
        }else if (socket.readyState === WebSocket.OPEN) {
            socket.send(message);
        }else {
            alert("连接尚未开启!");
        }
    }

</script>
<form onsubmit="return false;">

    <textarea name="message" style="width: 400px; height: 200px"></textarea>

    <input type="button" value="发送数据" onclick="send(this.form.message.value)">

    <h3>服务端输出:</h3>

    <textarea id="repsonseTest" style="width: 400px; height: 300px"></textarea>

    <input type="button" onclick="javascript:document.getElementById('repsonseTest').value=''" value="清空内容">
</form>
</body>
</html>

运行结果如下:
在这里插入图片描述
服务端的控制台打印的结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值