Netty(四)之数据通信的三种方式

三种数据通信方式

我们需要了解在真正项目中如何去考虑Netty的使用,我们需要考虑的问题是两台机器(甚至多台)使用Netty怎么进行通信,大体上分为三类。

  • 第一种:长连接

使用长连接通道不断开的形式进行通信,也就是服务器和客户端的通道一直处于开启状态,如果服务器的性能足够好,并且我们的客户端数量也比较少的情况下,我还是推荐这种方式。

  • 第二种:短连接

一次性批量提交数据采用短连接方式。也就是我们会把数据保存在本地临时缓冲去或者临时表里,界当达到临值时进行一次性批量提交,又胡总根据定时任务轮休提交,这种情况弊端是做不到实时传输,对实时性不高的应用程序中可以推荐使用。

  • 第三种:特殊的长连接

我们可以使用一种特殊的长连接,在指定某一时间之内,服务器与某台客户端没有任何通信,则端开连接。

 

短连接

没有响应的短连接:发送过去就断开连接

Netty(一)之helloworld   https://blog.csdn.net/qq_37171353/article/details/100180406   

的基础之上修改

修改TimeClient,添加了一个监听器,发送数据完毕后关闭连接

 //发送数据
            ChannelFuture channelFuture = f.channel().writeAndFlush(Unpooled.copiedBuffer("您好".getBytes()));
            channelFuture.addListener(ChannelFutureListener.CLOSE);//短连接

测试结果:服务器端收到数据,客户端没有收到相应。因为服务器发送完了就关闭了连接,自然不会收到请求

有相应的短连接:发送后接受请求后断开连接

Netty(一)之helloworld   https://blog.csdn.net/qq_37171353/article/details/100180406   

的基础之上修改

手写代码关闭连接

Netty(四)之数据通信的三种方式_第1张图片

 

还有一种关闭方式:添加监听器的变种

在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   https://blog.csdn.net/qq_37171353/article/details/100180406   

的基础之上修改

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

Netty(四)之数据通信的三种方式_第2张图片

测试结果:

程序一直都在运行状态

Netty(四)之数据通信的三种方式_第3张图片

 

 

特殊的长连接

规定时间内没有通信断开连接

Netty(一)之helloworld   https://blog.csdn.net/qq_37171353/article/details/100180406   

的基础之上修改

客户端和服务器端都要添加下面代码,而且放在第一个位置

 //添加超时断开连接,5秒没有交互断开连接
 socketChannel.pipeline().addLast(new ReadTimeoutHandler(5));

 我设置的超时时间为5秒,当我睡4秒时候,客户端成功发送“您好1”,服务器成功返回;因为睡了4秒不超过5秒,所以“您好2”成功发送并且接受到服务器的相应 

Netty(四)之数据通信的三种方式_第4张图片

 我设置的超时时间为5秒,当我睡6秒时候,客户端成功发送“您好1”,服务器成功返回;但是“您好2”没有发送成功,说明连接断开

Netty(四)之数据通信的三种方式_第5张图片

 

参考

  http://ifeve.com/netty5-user-guide/      文本

https://www.bilibili.com/video/av39500382/?p=6   视频

你可能感兴趣的:(【Netty】)