• 搞netty


    开始搞netty了

    查了下资料

    在使用NIO 的时候,最好不要配置 SO_LINGER,假设设置了该參数,在 close的时候如缓冲区有数据待写出,会抛出 IOException。

    //

    在netty框架中,类似org.jboss.netty.channel.SimpleChannelUpstreamHandler这样的关于NIO事件处理的抽象基类或接口都提供了channelClosed和channelDisconnected这两个接口,从字面意思分析,它们分别是“连接断开”和“连接关闭”的意思,语义非常相近,那么他们具体有什么区别的,笔者在org.jboss.netty.channel.socket.nio.NioWorker.java中找到了答案:
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //netty version: 3.1.5GA
    //file: org.jboss.netty.channel.socket.nio.NioWorker.java
    //method: static void close(NioSocketChannel channel, ChannelFuture future)
    //line: 581
     
    future.setSuccess();
    if (connected) {
        fireChannelDisconnected(channel);
    }
    if (bound) {
        fireChannelUnbound(channel);
    }
     
    cleanUpWriteBuffer(channel);
    fireChannelClosed(channel);
     
    我们可以看到,在上述代码中,在close channel的时候,会先判断当前channel是否处于connected状态,即是否已经成功地与远程地址建立了连接,如果是的话,就触发channelDisconnected事件;最后,再统一触发channelClosed事件。
     
    也就是说,任何对NioWorker.close(NioSocketChannel channel, ChannelFuture future)方法的调用都会触发channelClosed事件,这些事件可能包括如下几种:
    1. 已经与远程主机建立的连接,远程主机主动关闭连接,或者网络异常连接被断开的情况
    2. 已经与远程主机建立的连接,本地客户机主动关闭连接的情况
    3. 本地客户机在试图与远程主机建立连接时,遇到类似与connection refused这样的异常,未能连接成功时 
    而只有当本地客户机已经成功的与远程主机建立连接(connected)时,连接断开的时候才会触发channelDisconnected事件,即对应上述的1和2两种情况。
    上述猜想已经通过编写测试代码,模拟不同的情况得到了证实,如果还有不准确的地方,欢迎指正
     
    //
    数据发送后,代码不会被阻塞,而是顺序运行,也就是说,做了一件事件后,这件事情不一定已经成功,所以我们不能在下一行代码中百分百的确定其已经发送到了对方,因此,你会发行其很多方法都会返回一个"Future".只要注意到这一点,Netty的使用难度就不是很大了. 
  • 相关阅读:
    Java程序运行机制及开发环境
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/4285406.html
Copyright © 2020-2023  润新知