天天看點

Netty(四)之資料通信的三種方式

三種資料通信方式

我們需要了解在真正項目中如何去考慮Netty的使用,我們需要考慮的問題是兩台機器(甚至多台)使用Netty怎麼進行通信,大體上分為三類。

  • 第一種:長連接配接

使用長連接配接通道不斷開的形式進行通信,也就是伺服器和用戶端的通道一直處于開啟狀态,如果伺服器的性能足夠好,并且我們的用戶端數量也比較少的情況下,我還是推薦這種方式。

  • 第二種:短連接配接

一次性批量送出資料采用短連接配接方式。也就是我們會把資料儲存在本地臨時緩沖去或者臨時表裡,界當達到臨值時進行一次性批量送出,又胡總根據定時任務輪休送出,這種情況弊端是做不到實時傳輸,對實時性不高的應用程式中可以推薦使用。

  • 第三種:特殊的長連接配接

我們可以使用一種特殊的長連接配接,在指定某一時間之内,伺服器與某台用戶端沒有任何通信,則端開連接配接。

短連接配接

沒有響應的短連接配接:發送過去就斷開連接配接

Netty(一)之helloworld 

的基礎之上修改

修改TimeClient,添加了一個監聽器,發送資料完畢後關閉連接配接

//發送資料
            ChannelFuture channelFuture = f.channel().writeAndFlush(Unpooled.copiedBuffer("您好".getBytes()));
            channelFuture.addListener(ChannelFutureListener.CLOSE);//短連接配接      

測試結果:伺服器端收到資料,用戶端沒有收到相應。因為伺服器發送完了就關閉了連接配接,自然不會收到請求

有相應的短連接配接:發送後接受請求後斷開連接配接

Netty(一)之helloworld   

的基礎之上修改

手寫代碼關閉連接配接

Netty(四)之資料通信的三種方式

還有一種關閉方式:添加監聽器的變種

在handler中添加監聽器

這裡不是在 helloworld的基礎上修改,讓你看一下思路

package io.netty.example.time;

public class TimeServerHandler extends ChannelHandlerAdapter {

    @Override
    public void channelActive(final ChannelHandlerContext ctx) { // (1)
        final ByteBuf time = ctx.alloc().buffer(4); // (2)
        time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));

        final ChannelFuture f = ctx.writeAndFlush(time); // (3)
        f.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) {
                assert f == future;
                ctx.close();
            }
        }); // (4)
    }

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

長連接配接

Netty(一)之helloworld

的基礎之上修改

TimeClient中添加 option(ChannelOption.TCP_NODELAY, true)

Netty(四)之資料通信的三種方式

測試結果:

程式一直都在運作狀态

Netty(四)之資料通信的三種方式

特殊的長連接配接

規定時間内沒有通信斷開連接配接

Netty(一)之helloworld   

的基礎之上修改

用戶端和伺服器端都要添加下面代碼,而且放在第一個位置

//添加逾時斷開連接配接,5秒沒有互動斷開連接配接
 socketChannel.pipeline().addLast(new ReadTimeoutHandler(5));      

 我設定的逾時時間為5秒,當我睡4秒時候,用戶端成功發送“您好1”,伺服器成功傳回;因為睡了4秒不超過5秒,是以“您好2”成功發送并且接受到伺服器的相應 

Netty(四)之資料通信的三種方式

 我設定的逾時時間為5秒,當我睡6秒時候,用戶端成功發送“您好1”,伺服器成功傳回;但是“您好2”沒有發送成功,說明連接配接斷開

參考