java吧 关注:1,189,878贴子:12,600,202

【干货】一起来讲讲nio框架mina,netty3,netty4

取消只看楼主收藏回复




最近在看这几本书,虽然放弃了,但还是分享一下我的成果,骗点经夜,呸,是赚点经验!!


IP属地:湖北1楼2016-04-09 16:01回复
    二楼自己占,顺便申个精


    青铜星玩家
    百度移动游戏玩家均可认证(限百度账号),去领取
    活动截止:2100-01-01
    去徽章馆》
    IP属地:湖北2楼2016-04-09 16:02
    收起回复
      其实在培训机构,学习socket编程的时候,写过邮件收发练手。但那个时候基本就是bio,后来工作了,第一份工作是做游戏的,刚开始也是搞socket,但那个时候早忘记了,于是一边摸索,一边回顾,倒也写了个聊天服务器(不是简单的readLine,和read了,这些都是BufferedReader里面的方法,开始使用DataInputStream和DataOutputStream的readInt,readShort等方法,然后才理解原来学的int占4位是什么意思,short占两位,long占两位是什么意思)。


      青铜星玩家
      百度移动游戏玩家均可认证(限百度账号),去领取
      活动截止:2100-01-01
      去徽章馆》
      IP属地:湖北7楼2016-04-09 16:16
      收起回复
        后来老板说招不到java主程,要换php,然后就换了,但聊天系统老板希望是即时的,php做不了即时,所以单独做一个聊天系统,并且使用mina做底层框架。这是我第一次接触mina,但完全对这个框架不了解,老板是搞as的(actionScript)的,经验很足,自己理解了一下,写了Decoder和Encoder给我,剩下的就是我自己处理,而且也很简单,就是每个包拿到buffer之后,根据每个包的情况处理,现在感觉当时好蠢!!


        青铜星玩家
        百度移动游戏玩家均可认证(限百度账号),去领取
        活动截止:2100-01-01
        去徽章馆》
        IP属地:湖北8楼2016-04-09 16:16
        收起回复
          2年之后,老板又觉得实在受不了php不能广播,于是全面改为java实现,底层是找老板的一个朋友帮忙搭建的。使用netty3,这是我第一次使用netty3,跟第一次接触mina一样,完全不知道这东西怎么用的,但别人已经搭好了环境,我只需要处理业务逻辑,而且当时完全没有考虑过研究这玩意。虽然搞php这段时间也自己写过java,比如当时的高仿windows扫雷,现在在精品贴里应该还能看得到。但实在没法,也没那个能力去理解netty的原理,只能做着业务逻辑。虽然这时我已经厌倦了一直写业务逻辑


          青铜星玩家
          百度移动游戏玩家均可认证(限百度账号),去领取
          活动截止:2100-01-01
          去徽章馆》
          IP属地:湖北9楼2016-04-09 16:20
          回复
            然后我就辞职了,回老家学车,然后再来武汉,找了份新工作,全职java,使用spring mvc + ibatis + spring,又是一个我完全不了解的框架(培训的时候学的是struts2+spring3+hibernate3)
            因为是接别人的锅,为了能胜任这份工作,硬着头皮看,一个星期左右,才把系统的大概流程搞懂(包括spring mvc,ibatis,redis等的使用)


            青铜星玩家
            百度移动游戏玩家均可认证(限百度账号),去领取
            活动截止:2100-01-01
            去徽章馆》
            IP属地:湖北10楼2016-04-09 16:28
            收起回复
              现在开新项目,需要使用强连接,于是再次接触到netty3,并开始花时间了解他,同时也了解了一下mina和netty4


              青铜星玩家
              百度移动游戏玩家均可认证(限百度账号),去领取
              活动截止:2100-01-01
              去徽章馆》
              IP属地:湖北11楼2016-04-09 16:30
              回复
                ok现在正式开始讲


                青铜星玩家
                百度移动游戏玩家均可认证(限百度账号),去领取
                活动截止:2100-01-01
                去徽章馆》
                IP属地:湖北12楼2016-04-09 16:31
                回复
                  先从netty3开始吧。现在有点忙,所以更新比较慢


                  青铜星玩家
                  百度移动游戏玩家均可认证(限百度账号),去领取
                  活动截止:2100-01-01
                  去徽章馆》
                  IP属地:湖北14楼2016-04-09 17:11
                  回复

                    上图是服务器代码,定义了一个字符串的解码器,然后一个处理消息的handler,

                    处理消息的handler很简单,直接打印收到的消息

                    解码器也很简单,将收到的包按utf-8编码来解码

                    客户端的代码只有一个handler

                    handler只实现了一个发字符串的功能,在channel connected之后发送字符串


                    青铜星玩家
                    百度移动游戏玩家均可认证(限百度账号),去领取
                    活动截止:2100-01-01
                    去徽章馆》
                    IP属地:湖北18楼2016-04-09 17:59
                    收起回复
                      netty3中所有的消息处理连成一个handler链。每个节点都是一个ChannelHandler类型,但这个接口没有任何实现方法,如果自定义一个类实现这个接口,那么会报如下错误

                      错误说的很明白handler must be either org.jboss.netty.channel.ChannelUpstreamHandler or org.jboss.netty.channel.ChannelDownstreamHandler.
                      这见,添加到handler链的handler要么实现ChannelUpstreamHandler接口,要么实现ChannelDownstreamHandler接口


                      青铜星玩家
                      百度移动游戏玩家均可认证(限百度账号),去领取
                      活动截止:2100-01-01
                      去徽章馆》
                      IP属地:湖北19楼2016-04-09 18:16
                      回复
                        ChannelUpstreamHandler接口主要是收到客户端的消息时调用,而ChannelUpstreamHandler接口主要是给客户端发消息时调用。
                        当然,netty3给我们提供了很多基类用来扩展用的比如解码器为OneToOneDecoder,编码器为OneToOneEncoder。还有一个解码器为FrameDecoder,主要是用来处理断包和粘包的。


                        青铜星玩家
                        百度移动游戏玩家均可认证(限百度账号),去领取
                        活动截止:2100-01-01
                        去徽章馆》
                        IP属地:湖北20楼2016-04-09 18:28
                        回复
                          这里科普一下断包和粘包,因为tcp在发送消息时,根据他的算法,有可能把一些较小的包合并在一起发送或者把一些较大的包拆分后发送,所以就出现了所谓的断包和粘包。
                          如果对断包和粘包有不懂的,可以看以下这篇博客,或者直接百度
                          http://zgc168.iteye.com/blog/1880620


                          青铜星玩家
                          百度移动游戏玩家均可认证(限百度账号),去领取
                          活动截止:2100-01-01
                          去徽章馆》
                          IP属地:湖北22楼2016-04-09 18:35
                          回复
                            然后我们来说下解码器和编码器。这可以说是整个通讯中,我们可能唯一会关注的与底层相关,又不能说是底层的模块。
                            首先,先谈一谈FrameDecoder这个类
                            https://github.com/netty/netty/tree/3.10/src/main/java/org/jboss/netty/handler/codec/frame
                            frame包下的大部分解码器都继承自这个类,因为这个类是用来处理断包和粘包的
                            FrameDecoder类中有一个变量ChannelBuffer cumulation;
                            英文直接翻译是累积的意思,目录就是将未读完的包累积下来,与接下来发的包一起合并之后再解码。
                            因为前面说了,有可能出现断包和粘包,断包是直接读不出来完整的包,而粘包是有一个完整的包,但还有多余的数据。多余的数据也可能不是一个完整的包,而是断包,可以说粘包是可以包括断包的。
                            所以建议每一个继承自FrameDecoder的解码器对每一个连接而言都是单独的,而且必须这么做,除非你不你希望你的程序出现问题


                            青铜星玩家
                            百度移动游戏玩家均可认证(限百度账号),去领取
                            活动截止:2100-01-01
                            去徽章馆》
                            IP属地:湖北26楼2016-04-09 20:26
                            收起回复
                              都没人看么


                              青铜星玩家
                              百度移动游戏玩家均可认证(限百度账号),去领取
                              活动截止:2100-01-01
                              去徽章馆》
                              IP属地:湖北27楼2016-04-09 21:07
                              回复