我们需要了解在真正项目中如何去考虑Netty的使用,我们需要考虑的问题是两台机器(甚至多台)使用Netty怎么进行通信,大体上分为三类。
使用长连接通道不断开的形式进行通信,也就是服务器和客户端的通道一直处于开启状态,如果服务器的性能足够好,并且我们的客户端数量也比较少的情况下,我还是推荐这种方式。
一次性批量提交数据采用短连接方式。也就是我们会把数据保存在本地临时缓冲去或者临时表里,界当达到临值时进行一次性批量提交,又胡总根据定时任务轮休提交,这种情况弊端是做不到实时传输,对实时性不高的应用程序中可以推荐使用。
我们可以使用一种特殊的长连接,在指定某一时间之内,服务器与某台客户端没有任何通信,则端开连接。
在
Netty(一)之helloworld Netty(一)之helloworld_CBeann的博客-CSDN博客
的基础之上修改
修改TimeClient,添加了一个监听器,发送数据完毕后关闭连接
//发送数据
ChannelFuture channelFuture = f.channel().writeAndFlush(Unpooled.copiedBuffer("您好".getBytes()));
channelFuture.addListener(ChannelFutureListener.CLOSE);//短连接
测试结果:服务器端收到数据,客户端没有收到相应。因为服务器发送完了就关闭了连接,自然不会收到请求
在
Netty(一)之helloworld Netty(一)之helloworld_CBeann的博客-CSDN博客
的基础之上修改
手写代码关闭连接
在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 Netty(一)之helloworld_CBeann的博客-CSDN博客
的基础之上修改
TimeClient中添加 option(ChannelOption.TCP_NODELAY, true)
测试结果:
程序一直都在运行状态
规定时间内没有通信断开连接
在
Netty(一)之helloworld Netty(一)之helloworld_CBeann的博客-CSDN博客
的基础之上修改
客户端和服务器端都要添加下面代码,而且放在第一个位置
//添加超时断开连接,5秒没有交互断开连接
socketChannel.pipeline().addLast(new ReadTimeoutHandler(5));
我设置的超时时间为5秒,当我睡4秒时候,客户端成功发送“您好1”,服务器成功返回;因为睡了4秒不超过5秒,所以“您好2”成功发送并且接受到服务器的相应
我设置的超时时间为5秒,当我睡6秒时候,客户端成功发送“您好1”,服务器成功返回;但是“您好2”没有发送成功,说明连接断开