三種資料通信方式
我們需要了解在真正項目中如何去考慮Netty的使用,我們需要考慮的問題是兩台機器(甚至多台)使用Netty怎麼進行通信,大體上分為三類。
- 第一種:長連接配接
使用長連接配接通道不斷開的形式進行通信,也就是伺服器和用戶端的通道一直處于開啟狀态,如果伺服器的性能足夠好,并且我們的用戶端數量也比較少的情況下,我還是推薦這種方式。
- 第二種:短連接配接
一次性批量送出資料采用短連接配接方式。也就是我們會把資料儲存在本地臨時緩沖去或者臨時表裡,界當達到臨值時進行一次性批量送出,又胡總根據定時任務輪休送出,這種情況弊端是做不到實時傳輸,對實時性不高的應用程式中可以推薦使用。
- 第三種:特殊的長連接配接
我們可以使用一種特殊的長連接配接,在指定某一時間之内,伺服器與某台用戶端沒有任何通信,則端開連接配接。
短連接配接
沒有響應的短連接配接:發送過去就斷開連接配接
在
Netty(一)之helloworld
的基礎之上修改
修改TimeClient,添加了一個監聽器,發送資料完畢後關閉連接配接
//發送資料
ChannelFuture channelFuture = f.channel().writeAndFlush(Unpooled.copiedBuffer("您好".getBytes()));
channelFuture.addListener(ChannelFutureListener.CLOSE);//短連接配接
測試結果:伺服器端收到資料,用戶端沒有收到相應。因為伺服器發送完了就關閉了連接配接,自然不會收到請求
有相應的短連接配接:發送後接受請求後斷開連接配接
在
Netty(一)之helloworld
的基礎之上修改
手寫代碼關閉連接配接
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxczNzgzMxYzMzczYmZWMzYzX3QzM0ETMzEzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
還有一種關閉方式:添加監聽器的變種
在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(一)之helloworld
的基礎之上修改
用戶端和伺服器端都要添加下面代碼,而且放在第一個位置
//添加逾時斷開連接配接,5秒沒有互動斷開連接配接
socketChannel.pipeline().addLast(new ReadTimeoutHandler(5));
我設定的逾時時間為5秒,當我睡4秒時候,用戶端成功發送“您好1”,伺服器成功傳回;因為睡了4秒不超過5秒,是以“您好2”成功發送并且接受到伺服器的相應
我設定的逾時時間為5秒,當我睡6秒時候,用戶端成功發送“您好1”,伺服器成功傳回;但是“您好2”沒有發送成功,說明連接配接斷開