netty 對(duì)websocket 支持

WebSocket

WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議蔽挠。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信————允許服務(wù)器主動(dòng)發(fā)送信息給客戶端住闯。

WebSocket解決了那些問(wèn)題

  • 1,http 是無(wú)狀態(tài),基于請(qǐng)求/響應(yīng)模型澳淑,導(dǎo)致了不識(shí)別用戶比原,每次請(qǐng)求都是一個(gè)新的用戶,
    這就產(chǎn)生了cookie,session 記錄用戶的狀態(tài)的技術(shù)杠巡。

  • 2量窘,http1.1 進(jìn)行網(wǎng)絡(luò)請(qǐng)求可以重用既有的連接, WebSocket只需進(jìn)行連接一次氢拥。

  • 3蚌铜,向客戶端推送數(shù)據(jù) http輪詢:http的輪詢實(shí)現(xiàn)是客戶端每個(gè)一段時(shí)間就進(jìn)行網(wǎng)絡(luò)請(qǐng)求,
    如果服務(wù)器端沒(méi)有數(shù)據(jù)返回也就表示這次請(qǐng)求是無(wú)效的嫩海,多次這樣的網(wǎng)絡(luò)請(qǐng)求會(huì)影響網(wǎng)絡(luò)帶寬厘线,WebSocket是基于tcp全雙工通信,只要連接通道建立出革,服務(wù)器可以向客戶端推送數(shù)據(jù)造壮。

  • 4,http 請(qǐng)求包括header 和 要返回的結(jié)果返回給客戶端骂束,往往header大于內(nèi)容的容量,
    websoket 瀏覽器和服務(wù)器端會(huì)建立長(zhǎng)連接耳璧,雙方式對(duì)等的,只要發(fā)送數(shù)據(jù)本省展箱,不在需要任何header的信息 旨枯。

netty 服務(wù)器端

  • 1,MyServer.java
public class MyServer {
    public static void main(String ...arg) throws Exception{

        // 負(fù)責(zé)接收客戶端連接
        NioEventLoopGroup bossGroup = new NioEventLoopGroup();
        // 負(fù)責(zé)處理連接
        NioEventLoopGroup wokerGroup = new NioEventLoopGroup();

        try{
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup,wokerGroup)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new WebSocketChannelInitializer());

            ChannelFuture channelFuture = serverBootstrap.bind(9999).sync();
            channelFuture.channel().closeFuture().sync();


        } finally {
            bossGroup.shutdownGracefully();
            wokerGroup.shutdownGracefully();
        }

    }
}

  • 2混驰,WebSocketChannelInitializer.java
public class WebSocketChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast(new HttpServerCodec());
        pipeline.addLast(new ChunkedWriteHandler());
        pipeline.addLast(new HttpObjectAggregator(8192));
        //websocket 請(qǐng)求路徑
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));

        pipeline.addLast(new TextWebSocketFrameHandler());

    }
}


  • 3,TextWebSocketFrameHandler.java
public class TextWebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        System.out.println("服務(wù)器收到:"+msg.text());
        ctx.channel().writeAndFlush(new TextWebSocketFrame("服務(wù)器時(shí)間:"+ LocalDateTime.now()));

    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        //每個(gè)channel 都有一個(gè)唯一的id
        System.out.println("handlerAdded: "+ctx.channel().id().asLongText());
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        System.out.println("handlerRemoved: "+ctx.channel().id().asLongText());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}



WebSocket js 使用

  • 1攀隔,創(chuàng)建對(duì)象
var ws = new WebSocket(url,name);

  • 2,發(fā)送文本消息
ws.send(msg);

  • 3栖榨,接收消息
ws.onmessage = (function(){...})();

  • 4昆汹,錯(cuò)誤處理
ws.onerror = (function(){...})();

  • 5,關(guān)閉連接
ws.close();

客戶端端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>websoket 客戶端</title>
</head>
<body>
<form onsubmit="return false">
    <textarea name="message" style="width:400px;height: 200px"></textarea>
    <input type="button" value="發(fā)送數(shù)據(jù)" onclick="send(this.form.message.value)">

    <h3>服務(wù)器輸出:</h3>
    <textarea id="responseText" style="width: 400px; height: 300px"></textarea>

    <input type="button" onclick="javascript:document.getElementById('responseText').value=''" value="清空內(nèi)容">
</form>

</body>
<script type="text/javascript">
    var socket;
    if (window.WebSocket) {
        socket = new WebSocket("ws://127.0.0.1:9999/ws")
        var ta = document.getElementById("responseText");

        socket.onmessage = function (event) {
            ta.value = ta.value + "\n" + event.data;
        }

        socket.onopen = function (event) {
            ta.value = "連接開(kāi)啟"
        }

        socket.onclose = function (event) {
            ta.value = ta.value + "\n" + "連接關(guān)閉";
        }

    } else {
        alert("瀏覽器不支持websocket")
    }

    function send(message) {
        if(!window.WebSocket) {
            return;
        }

        if(socket.readyState == WebSocket.OPEN){
            socket.send(message)
        }else{
            alert("連接尚未成功")
        }

    }

</script>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婴栽,一起剝皮案震驚了整個(gè)濱河市满粗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愚争,老刑警劉巖映皆,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤聘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捅彻,警方通過(guò)查閱死者的電腦和手機(jī)组去,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)步淹,“玉大人从隆,你說(shuō)我怎么就攤上這事∠涂酰” “怎么了广料?”我有些...
    開(kāi)封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵砾脑,是天一觀的道長(zhǎng)幼驶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)韧衣,這世上最難降的妖魔是什么盅藻? 我笑而不...
    開(kāi)封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮畅铭,結(jié)果婚禮上氏淑,老公的妹妹穿的比我還像新娘。我一直安慰自己硕噩,他們只是感情好假残,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著炉擅,像睡著了一般辉懒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谍失,一...
    開(kāi)封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天眶俩,我揣著相機(jī)與錄音,去河邊找鬼快鱼。 笑死颠印,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抹竹。 我是一名探鬼主播线罕,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窃判!你這毒婦竟也來(lái)了闻坚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兢孝,失蹤者是張志新(化名)和其女友劉穎窿凤,沒(méi)想到半個(gè)月后仅偎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雳殊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年橘沥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夯秃。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡座咆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仓洼,到底是詐尸還是另有隱情介陶,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布色建,位于F島的核電站哺呜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏箕戳。R本人自食惡果不足惜某残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陵吸。 院中可真熱鬧玻墅,春花似錦、人聲如沸壮虫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囚似。三九已至剩拢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谆构,已是汗流浹背裸扶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搬素,地道東北人呵晨。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像熬尺,于是被迫代替她去往敵國(guó)和親摸屠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理粱哼,服務(wù)發(fā)現(xiàn)季二,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,111評(píng)論 25 707
  • 為什么要壓縮? 現(xiàn)在的Web項(xiàng)目總是離不開(kāi)大量JavaScript和CSS胯舷,而文件的體積也越來(lái)越大刻蚯,也越來(lái)越影響頁(yè)...
    碼農(nóng)隨想錄閱讀 1,862評(píng)論 1 5
  • 第一次打卡,畫一只小可愛(ài) (???ω???)
    小K醬閱讀 313評(píng)論 0 1
  • 夏至二日桑嘶,子時(shí)炊汹,尚未飯否。臨窗倚懶逃顶,黑染一片讨便。 是時(shí),電斷以政,念及下傷霸褒,心怯怯焉。頓覺(jué)憂從心燙盈蛮,餓蟲亂飛废菱,坐哭 見(jiàn)家...
    蜀錦景泰藍(lán)閱讀 207評(píng)論 0 1