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