前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty(四)之数据通信的三种方式

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

作者头像
CBeann
发布2023-12-25 17:19:14
2240
发布2023-12-25 17:19:14
举报
文章被收录于专栏:CBeann的博客CBeann的博客

三种数据通信方式

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

  • 第一种:长连接

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

  • 第二种:短连接

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

  • 第三种:特殊的长连接

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

短连接

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

Netty(一)之helloworld Netty(一)之helloworld_CBeann的博客-CSDN博客

的基础之上修改

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

代码语言:javascript
复制
 //发送数据
            ChannelFuture channelFuture = f.channel().writeAndFlush(Unpooled.copiedBuffer("您好".getBytes()));
            channelFuture.addListener(ChannelFutureListener.CLOSE);//短连接

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

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

Netty(一)之helloworld Netty(一)之helloworld_CBeann的博客-CSDN博客

的基础之上修改

手写代码关闭连接

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

在handler中添加监听器

这里不是在 helloworld的基础上修改,让你看一下思路

代码语言:javascript
复制
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博客

的基础之上修改

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

代码语言:javascript
复制
 //添加超时断开连接,5秒没有交互断开连接
 socketChannel.pipeline().addLast(new ReadTimeoutHandler(5));

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三种数据通信方式
  • 短连接
    • 没有响应的短连接:发送过去就断开连接
      • 有相应的短连接:发送后接受请求后断开连接
        • 还有一种关闭方式:添加监听器的变种
        • 长连接
        • 特殊的长连接
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档