`
切切克闹
  • 浏览: 15382 次
社区版块
存档分类
最新评论

Netty开发记录(番外篇)

阅读更多

 

今天我们说说netty可以干什么吧,这是什么东西.

Netty是一套开发框架,和spring,hibernate等等一样都是框架,但是(重点来了哈)它和后两者的功能不一样。采用框架开发项目的好处不言而喻了。

Netty是基于java NIO开发出来的框架,也就是说,它是java编写的,主要用到了java NIO库,还有线程那些东西。所以Netty的jar引入的时候不需要下载额外的jar包了。java NIO就不多说了,不懂就暂且当成IO,但是记住,有区别。

Netty这套框架主要用于C/S的项目,但是现在C、B已经很混淆了,我就说Netty可以开发用哪些协议的项目吧,TCP/IP,HTTP,UDP等等,如果不懂,就先记着,但是记住自己还有哪些不懂的哦。:)

 

下面我举个例子说明下Netty的优越性,在以前我用java开发web项目的时候,前后台数据交互时,我是不需要懂自己传输的,我只知道一些方法,譬如request.getparameter()就拿到前台传过来的数据了,但是这中间经历了什么,我是不知道的,就算不知道 好像也不影响我开发项目。但是(哈哈,好像每个但是都是重点哦)这样我能知道我的服务器这个时间点上传输了多少K的数据吗?显然有些麻烦。(问题来了,网络传输,数据是以什么形式传送的?)另外,HTTP协议每次都要传输头信息,等等很多信息,这会很消耗带宽的哦。

 

后来啊,程序员前辈就想了很多方法来减少数据传输的量,譬如,现在熟知的,Ajax请求,每次只需要传输响应的数据就OK了,这种键值对的传送方式确实很大程度上削减了传输的数据量,而且开发起来也相当的友好。

 

但是HTTP协议有个非常痛苦的缺点,它是没有记忆的哦。也就是说,服务器是不记得你的哦,但是前辈的智慧是无穷的,session很好解决了这个问题,而分布式网络系统,首先要解决的就是这个session共享的问题,其实嘛,我们不用怕,别被这种高大上的词给唬住了,那都不是事,遇到问题一样能解决。

 

好了,这个例子一下就说大了,一句话总结,东西大了问题就多。

而Netty天生就不怕这些大批量的东西(其实到了很大的时候 它也搞不定),以TCP/IP开发为例说明下Netty相关的内容;

1,Netty可以让程序员直接接触到传输的字节流,也就是说,你清楚的知道我TM传了这么多东西啊!

2,Netty允许你用第三方或者是自己编写的字节编解码器,譬如Facebook的Thrift压缩二进制编码技术,Google的protobuf编码(很高大上?其实就是Object转成byte,这有什么啊,专门吓唬我们这种小白?哎,社会啊),这些编码技术确实很厉害,相比java自带的序列化性能强得不是一星半点,但是so what,我司自己进行编码,解码,直接操作字节流(但是很痛苦有木有){喂,喂,那谁,这前三个字节是指令。那谁,接着的7个字节是长度},哎。就怕前期设计不好,后期从新设计。而且不同的指令,字节流不同啊 。所以,这个时候就考验设计模式学得怎么样了。一展开话题就很多了,不说了。

3,拓展性,今天你用它开发tcp,明天可以开发UDP,后天来个WebSocket.那么问题来了,如果出现这种事,你猜我会骂谁大笑?

4,哎,说得自己都醉了。先学学,学好了直接用上去,项目跑起来再说,一遍一遍的重构,心得体会就都有了。

好了不说了,来例子吧。Netty用在什么地方,阿里的dubbo,hadoop。现在不说,今天就到这吧。

对了,我忘记说,大家可以去Netty的官网,找到一些官方给出的例子,这些很好,能跑起来;官方还给出了一些git的链接,但是这里面的项目,我试两个,都没法正常的运行。参照这些例子,再买本书,好好研究下,直接搞项目,没问题。

1
2
分享到:
评论
10 楼 在世界的中心呼喚愛 2014-10-29  
切切克闹 写道
在世界的中心呼喚愛 写道
在世界的中心呼喚愛 写道
切切克闹 写道
在世界的中心呼喚愛 写道
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。

你可以用反射,在channelRead中处理。

什么意思呢?
反射?
我接收到的字节,我需要改动,然后在发送...
这个怎么反射?没有什么关系吧

就是不想在handler里改动,然后发送...想放在另一个类里处理


我明白你的意思,你更希望有个监听,收到字节后,然后调用其他类的方法处理。我的意思是你在Handler里面通过new或者newInstance拿到示例,然后通过method.invoke的方式执行相关的方法。

我的思想还是java原生socket发送那种,调用个方法,然后直接处理;刚刚接触netty时间不久。。

netty不能像java自带的socket发送那样,封装个工具类,然后send和receive那样,调用个方法就行?

你说用ChannelFuture去监听事件?接收到数据,在去调用其他方法,但是我这个操作,最终要转换成其他数据,然后在返回给前端。。
我疑问还是在那main方法之后获取handler中的数据,我运行几个官方例子,他们接收handler里的数据是要在 run方法里调用。。

public void run() throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .handler(new FactorialClientInitializer(count));

            // Make a new connection.
            ChannelFuture f = b.connect(host, port).sync();

            // Get the handler instance to retrieve the answer.
            FactorialClientHandler handler =
                (FactorialClientHandler) f.channel().pipeline().last();

            // Print out the answer.
            System.err.format("Factorial of %,d is: %,d", count, [color=red]handler.getFactorial()[/color]);
        } finally {
            group.shutdownGracefully();
        }
    }

我想在run方法之外没有办法调用了。。。
handler.getFactorial()这个方法就是handler里定义一个同步队列,然后返回的
我的协议是udp。
9 楼 切切克闹 2014-10-28  
在世界的中心呼喚愛 写道
在世界的中心呼喚愛 写道
切切克闹 写道
在世界的中心呼喚愛 写道
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。

你可以用反射,在channelRead中处理。

什么意思呢?
反射?
我接收到的字节,我需要改动,然后在发送...
这个怎么反射?没有什么关系吧

就是不想在handler里改动,然后发送...想放在另一个类里处理


我明白你的意思,你更希望有个监听,收到字节后,然后调用其他类的方法处理。我的意思是你在Handler里面通过new或者newInstance拿到示例,然后通过method.invoke的方式执行相关的方法。
8 楼 在世界的中心呼喚愛 2014-10-28  
在世界的中心呼喚愛 写道
切切克闹 写道
在世界的中心呼喚愛 写道
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。

你可以用反射,在channelRead中处理。

什么意思呢?
反射?
我接收到的字节,我需要改动,然后在发送...
这个怎么反射?没有什么关系吧

就是不想在handler里改动,然后发送...想放在另一个类里处理
7 楼 在世界的中心呼喚愛 2014-10-28  
切切克闹 写道
在世界的中心呼喚愛 写道
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。

你可以用反射,在channelRead中处理。

什么意思呢?
反射?
我接收到的字节,我需要改动,然后在发送...
这个怎么反射?没有什么关系吧
6 楼 切切克闹 2014-10-28  
linginfanta 写道
这是干货,秘鲁玛卡

必须的,24k纯干货
5 楼 切切克闹 2014-10-28  
在世界的中心呼喚愛 写道
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。

你可以用反射,在channelRead中处理。
4 楼 linginfanta 2014-10-28  
这是干货,秘鲁玛卡
3 楼 在世界的中心呼喚愛 2014-10-28  
切切克闹 写道
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。

我的问题:handler中channelRead接收到的消息,我不想在channelRead中处理,我想在另一个类中处理,我目前用同步队列存这个数据,然后在另一个类里取,问题取不出来。。
我协议是udp的。。
原来java.net的udp协议处理报文,可以这样send之后,接收,处理数据,再把处理的数据send。。
netty我是不懂怎么实现。。
2 楼 切切克闹 2014-10-28  
lassove 写道
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

你的难点在哪,哪块搞不清楚了。
1 楼 lassove 2014-10-28  
最近也在搞netty开发 貌似没大神说的那么简单啊 坐等更多分享

相关推荐

Global site tag (gtag.js) - Google Analytics