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

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

三种数据通信方式


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


第一种:长连接

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


第二种:短连接

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


第三种:特殊的长连接

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


短连接


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



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


的基础之上修改


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


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


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


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



Netty(一)之helloworld  


的基础之上修改


手写代码关闭连接


8.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)


9.png


测试结果:


程序一直都在运行状态


10.png


特殊的长连接


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



Netty(一)之helloworld  


的基础之上修改


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


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


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


11.png


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


12.png




目录
相关文章
|
8月前
|
Java
【Netty 网络通信】Netty 工作流程分析
【1月更文挑战第9天】Netty 工作流程分析
|
8月前
|
网络协议
【Netty 网络通信】Socket 通信原理
【1月更文挑战第9天】【Netty 网络通信】Socket 通信原理
|
8月前
|
Java Maven
【Netty 网络通信】启动通信服务端
【1月更文挑战第9天】【Netty 网络通信】启动通信服务端
|
3月前
|
XML Java Nacos
网络协议与Netty
网络协议与Netty
|
8月前
|
前端开发
【Netty 网络通信】ChannelFuture 解析
【1月更文挑战第9天】【Netty 网络通信】ChannelFuture 解析
|
8月前
|
前端开发 Java 网络安全
【Netty 网络通信】Netty 核心组件
【1月更文挑战第9天】【Netty 网络通信】Netty 核心组件
|
8月前
|
Java 调度
【Netty 网络通信】Reactor模式
【1月更文挑战第9天】【Netty 网络通信】Reactor模式
|
8月前
|
缓存 Java API
【Netty 网络通信】Channel 接口解析
【1月更文挑战第9天】【Netty 网络通信】Channel 接口解析
|
存储 Java Linux
Netty实战(四)Netty的传输
流经网络的数据总是具有相同的类型:字节。这些字节是如何流动的主要取决于我们所说的网络传输。
191 0
|
JSON 网络协议 算法
Netty之协议设计
Netty之协议设计