Netty学习 前言简介

=======

  1. 我们公司最近决定做个基于netty tcp的IM程序,由于最近项目比较紧张,所以没办法,只能我和另外一个做安卓的同事一起学习开发。在这里先说一句瓜皮呦!而且项目分了好多个分支,分别处理不同项目的不同需求,不得不说,有一个好的PM挺重要的,然而我没遇到过。第一次写博客,比较啰嗦,希望大家别在意啊,讲的有问题的地方希望大家能都多多指正,先谢过啦!
  2. 先说下这一系列博客的预期构思吧
    1.首先肯定是netty的一些个人理解,学习的时候总发现,没有什么特别系统的netty教程,当然不是说大牛写的文章不好。主要是觉得仅仅是多功能集合实现的教程没多少。所以小弟就产生了一个大胆的想法

    2.其次就是netty的基础教程吧,本着帮大家度过一些坑的原则,但是要是到时候出现了一些意料之外的事情,比如用了我的办法还是报错啥的,我只能说:rua!我能怎么办,我也很绝望啊,毕竟我只是个3年的小菜鸟

    3.还有就是netty分布式架构的一些想法吧,最近正在实现中,目前上线的仅仅是单个netty服务器,撑tcp长连接目前不成问题。但是后期肯定得往分布式去走,然而我就被苦逼的指派过来设计了。
    跟同事开玩笑说,拿着程序员的工资,干着架构的活 <手动捂脸>

  3. 有时间我就会更新,也希望大家有啥问题能跟我多多讨论啥的。总觉得自己路子是不是走歪了,跑来写netty。无所谓了,反正本来也就不正。说下用到的东西吧
    1.netty 4.x,不想用5.0,有些东西比较坑。
    2.protobuf编解码,原本还是用的基础的ObjectDe/Encoder,感觉太丢人了,就换了
    3.ChannelGroup实现广播,没用UDP,主要是怕丢包
    4.jfinal+redis,jfinal是公司要求的,一个国产开源框架,别鄙视先,我也想用springboot,老大不让啊,j2cache是自己加的
    5.oracle数据库,这啥都不说了,我宁愿用mysql
    6.Quartz定时轮询程序,业务需要
    其他的应该也没啥了吧,额…….恩,没啥了。这次就不写教程先,先贴段代码吧,省的你们说这文章水的不行
    netty server的启动类代码,有需要的拿去改改,亲测还行。毕竟已经跑上线了,并发承载能力还不错

package cn.softsz.mc.chat.Plugin;import com.jfinal.log.Log;
import com.jfinal.plugin.IPlugin;import cn.softsz.mc.chat.listener.ChatListener;
import cn.softsz.mc.chat.pipeline.InitializerPipeline;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.epoll.EpollChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
/*** netty插件的配置* @author liuxy**/
public class ChatPlugin implements IPlugin{private static final Log log = Log.getLog(ChatPlugin.class);private final EventLoopGroup bossGroup = new NioEventLoopGroup();private final EventLoopGroup workerGroup = new NioEventLoopGroup(4);private int port;public ChatPlugin(int port){this.port = port;}@Overridepublic boolean start() {try{ServerBootstrap server = new ServerBootstrap();server.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class);server.childHandler(new InitializerPipeline());//标识当服务器请求处理线程全满时,用于临时存放已经完成三次握手的请求的队列的最大长度server.option(ChannelOption.SO_BACKLOG, 1024);server.option(ChannelOption.SO_REUSEADDR, true).option(ChannelOption.SO_RCVBUF, 10 * 1024)  .option(ChannelOption.SO_SNDBUF, 10 * 1024)  .option(EpollChannelOption.SO_REUSEPORT, true);//保持长连接server.childOption(ChannelOption.SO_KEEPALIVE, true);server.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);//通过NoDelay禁用nagle,使消息立即发出去,不用等到一定的数据量才发出去server.childOption(ChannelOption.TCP_NODELAY, true);Channel ch = server.bind(port).sync().channel();//使用监听器的方式防止启动jfinal与netty冲突ch.closeFuture().addListener(new ChatListener());log.info("SYSTEM - SERVER PORT: " + port);return true;}catch(Exception e){log.error("",e);}return false;}@Overridepublic boolean stop() {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();return true;}

这是jfinal插件形式的,改改就能用,毕竟修修改改又是个新项目啊!

下面这个是InitializerPipeline的配置

package cn.softsz.mc.chat.pipeline;import java.util.concurrent.TimeUnit;import cn.softsz.mc.chat.handler.BroadcastHandler;
import cn.softsz.mc.chat.handler.ChatHandler;
import cn.softsz.mc.chat.handler.GroupCreateHandler;
import cn.softsz.mc.chat.handler.LoginHandler;
import cn.softsz.mc.chat.handler.MsgChatHandler;
import cn.softsz.mc.chat.handler.PingHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;/*** 管道配置类* @author liuxy**/
public class InitializerPipeline extends ChannelInitializer<SocketChannel> {static final EventExecutorGroup MSGChATGROUP = new DefaultEventExecutorGroup(2); static final EventExecutorGroup PINGChATGGROUP = new DefaultEventExecutorGroup(2); static final EventExecutorGroup ChATGROUP = new DefaultEventExecutorGroup(2); static final EventExecutorGroup LOGINGROUP = new DefaultEventExecutorGroup(2); static final EventExecutorGroup GROUPCREATEGROUP = new DefaultEventExecutorGroup(2);static final EventExecutorGroup BMSGGROUP = new DefaultEventExecutorGroup(2);public InitializerPipeline() {}@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//心跳的定时触发器ch.pipeline().addLast(new IdleStateHandler(41, 0, 0, TimeUnit.SECONDS)); //防止TCP丢包的编解码pipeline.addLast(new LengthFieldBasedFrameDecoder(65535,0,2,0,2));//protobuf编码器ch.pipeline().addLast(new ProtobufDecoder(Msg.Message.getDefaultInstance()));//TCP丢包解码器pipeline.addLast(new LengthFieldPrepender(2));//protobuf解码器pipeline.addLast(new ProtobufEncoder());//所有消息先到msg的handler中进行判断分发pipeline.addLast(MSGChATGROUP,new MsgChatHandler());//心跳处理器pipeline.addLast(PINGChATGGROUP,new PingHandler());//聊天信息处理器pipeline.addLast(ChATGROUP,new ChatHandler());//登陆信息处理器pipeline.addLast(LOGINGROUP,new LoginHandler());//群组创建处理器pipeline.addLast(GROUPCREATEGROUP,new GroupCreateHandler());pipeline.addLast(BMSGGROUP,new BroadcastHandler());}
}

严禁抄袭!!!开玩笑的,要用的拿去,转载帮我留个地址就行。不然……..,我也没办法啊,总不能顺着网线爬过去打你吧。就先这样吧,希望大家期待我下一篇文章!略略略

Netty学习开发之路相关推荐

  1. 我的Java开发之路

    最近有一位小伙伴通过公众号给我留言, "我参加工作没多久,看着圈里的技术大牛,特别羡慕,也渴望成为技术大牛,想让您分享一下从小白到大牛是怎样练成的,我该如何提高自己" 首先,谢谢这 ...

  2. 攀岩时代:HMS Core 6.0与移动开发之路

    今年的东京奥运会中,一些全新运动项目首次进入奥运是一大看点.其中就包括科技界经常用以比喻自己的:攀岩. 刚刚加入奥运大家庭的攀岩运动,需要选手在陡峭的崖壁,甚至负角度情况下,在仅有的几个发力点支撑下向 ...

  3. 我的App开发之路:从零开始到上线赚钱

    我的App开发之路:从零开始到上线赚钱 背景介绍 本人从第一次写代码赚钱开始,到现在已经12年了,使用过多种操作系统.编程语言. 现在作为一名个人开发者,开发一些小应用. 本文就应用软件开发做个简单总 ...

  4. 记本阶段建站心得,是走无限做垃圾站之路还是真正的开发之路

    不知不觉,上班有三个月了,三个月除却一些公司里杂七杂八的事,我做了四个站,第一个是六安市志愿者会员管理系统,比较简单,用TP开发,从前台设计.布局,到数据库设计,再到后台代码,改了又改,最后花了近一个 ...

  5. 细说inchat系统客户端开发之路

    Inchat系统中间件基础运行环境是经过统一规划的以WebLogic.JBOSS为主的集群环境,企业集成平台是以基础业务应用为基础服务于上层平台和基础业务应用的高度集成平台,数据中心是企业公共数据的集 ...

  6. Qt开发之路39---Qt pro项目检测编译器版本(64位或32位)

    方案一:利用QT_ARCH contains(QT_ARCH, x86_64){message("64-bit") }else{message("32-bit" ...

  7. 04_HUD_Qt_for_Python开发之路2

    欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈. 文章目录 HUD_Qt_for_Python开发之路2 1 设置程序名称 2 隐藏窗口标题栏 3 设置窗口透明裁剪 4 修改下 ...

  8. H5前端开发以及小程序开发之路

    好久没写博客了,今天心血来潮.总结下.近一年的前端开发之路. 首先,用了ionic+cordova技术框架开发纯粹的混合APP(得有angular的基础知识),一个商城项目,也用了vue,编写单页面, ...

  9. Qt开发之路44---Qt Creator 设置移动控件的最小距离

    一:问题 Qt Creator编辑UI时,按上下左右间移动控件默认最小是10个像素点,可不可以设置小一些? 二:方法,配置更改 工具-选项-设计师-表单-栅格X/栅格Y,调整大小!如下图 三:方法,属 ...

最新文章

  1. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  2. 自定义view-波纹扩散(圆扩散)
  3. 【SpringBoot】在SpringBoot中使用Ehcache
  4. Fluid给数据弹性一双隐形的翅膀 (1) -- 自定义弹性伸缩
  5. 零基础如何学前端,如何规划?
  6. 2020,国产 AI 开源框架“剑指”TensorFlow、PyTorch
  7. 前端静态页面html珠宝首饰电商平台网站购物商城系统.rar含源码
  8. vector的几种初始化及赋值方式
  9. eclipse快捷键介绍
  10. JavaScript函数创建表格
  11. 一条用来表示“思路非常乱。。。”的博客
  12. cogs 259. 亲戚
  13. 【引用】pygame菜鸟入门指南
  14. NOI / 2.1基本算法之枚举 1809:两倍
  15. clang diagnostic用例
  16. 免费AWS EC2实例
  17. cv2.contourArea、cv2.arcLength、cv2.approxPolyDP、cv2.convexHull、cv2.boundingRect、cv2.minAreaRect
  18. 练习-Java输入输出之字节数据输入输出之综合练习
  19. linux 内核 视频 下载地址,Linux内核视频教程种子链接
  20. Linux - top命令详解(监视进程和Linux整体性能)

热门文章

  1. 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
  2. RV1126笔记二十三:Nginx及cgi移植
  3. oracle常用创建模式,ORACLE 常用操作命令
  4. 虎头蛇尾的韩文学习记录
  5. 自旋对于synchronized关键字的底层意义与价值分析:
  6. 1.7 URL与端点
  7. 【中等】和可被K整除的子数组
  8. 对于“你需要Administrator权限才能删除该文件”情况的处理办法
  9. 第二周例行报告(王伟东)
  10. 大一计算机论文_大一计算机论文大纲模板范文 大一计算机论文提纲怎样写