Java Netty 初步
一 前言
netty和mina其实是一个人写的,所以风格非常类似。而在了解了netty和mina之后,笔者真是了解了Java框架的“高大全”。框架嘛,就是将通用的部分固定下来,我们在固定的位置填自己的逻辑代码就可以了。
二 netty架构
从使用上将,netty最后该来的“效果”很像http编程(据说tomcat的实现也跟netty有关,至少跟java nio有关)。
三 普通的java web开发与Netty的对比
如果不谈struts或spring mvc等上层组件,使用最原始的servlet来构建web项目,我们通常会用到servlet、listener和filter等三个组件。
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {PrintWriter out = resp.getWriter();out.write("hello world");}
}
我们知道,http的底层实现仍然是tcp,亦或者说,browser与web server底层仍然是socket通信。而通过j2ee,呈现在我们面前的是一个servlet。从HttpServletRequest可以拿到请求数据,通过HttpServletResponse可以写回响应。至于数据的encode与decode、socket通信、socket阻塞等细节完全不用关心。
与此同时,j2ee也提供基于事件的机制,那就是listener。
public class HelloListener implements ServletContextListener{public void contextDestroyed(ServletContextEvent arg0) {System.out.println("HelloListener contextDestroyed");}// web项目启动后会触发该方法public void contextInitialized(ServletContextEvent arg0) {System.out.println("HelloListener contextInitialized");}
}
对数据处理的粒度也是可以细化的,比如在真正处理数据前,先将其转换为json格式等,这些可以通过filter来完成。
public class HelloFilter implements Filter{public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stub}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}
}
所以j2ee主要实现了以下效果:
- 屏蔽了底层tcp的通信细节。(因为操作中看不到一点socket的痕迹,很容易让人认为web服务器是一个“独立的”高大上的技术)
- 规范了数据处理。(数据接收,数据转换,数据处理,数据输出)
- 提供了事件通知等机制,可以让代码及时通信转台变化做出反应。
总之,我们有很多办法实现两个系统间的相互访问,比如http client访问http server。但http并没有覆盖所有场景,比如无法处理大文件、近实时消息(比如聊天或财务数据)。socket肯定可以实现上述功能,但它太麻烦了。而netty作为一个“网络通讯框架”,就是用来解决这个问题。
netty中的IOHandler组件,便类似上述三个组件。
public class MyHandler extends ChannelHandlerAdapter{// 连接建立时@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {super.channelActive(ctx);}// 连接断开时@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {super.channelInactive(ctx);}// 接收到数据时(msg为接收到的数据,输出数据通过ctx写出)@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg)throws Exception {super.channelRead(ctx, msg);}// channelRead方法执行完毕时@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {super.channelReadComplete(ctx);}
}
handler可以形成一个pipeline,依次对数据进行处理。比如在pipeline中可以添加一个encoder(也继承自ChannelHandlerAdapter),在对数据进行处理前,先进行编码。
说了这些,其实想结合http和netty说明一下,网络通信框架在做什么,一般提供什么样的封装等等。
四 引用
Netty初步
转载于:https://www.cnblogs.com/qiankunli/p/4541628.html
Java Netty 初步相关推荐
- Netty初步之hello world
http://blog.csdn.net/cxhzqhzq/article/details/6611977 Java的网络操作一直比较复杂,虽然说在加入NIO之后简单了些,但还不是我这些菜鸟玩得起的, ...
- 201671010135 2016--2017java程序设计对java的初步认识和对第一,二章的总结(0)
201671010135 2016--2017<java程序设计>对java的初步认识和对第一,二章的总结(0) java是一种程序语言设计.html是一种描述网页结构的方式.除了用于在 ...
- java netty聊天室_netty实现消息中心(二)基于netty搭建一个聊天室
前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...
- java 带宽控制_如何使用Java netty正确限制带宽使用?
对于我使用netty nio lib在 Java中开发的下载客户端,我还实现了带宽限制功能.从技术上讲,我是通过GlobalTrafficShapingHandler对象完成的.基于这个类'JavaD ...
- tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...
TTIoT云端物联网组件;面向JAVA;以事件为驱动;为设备提供安全可靠的连接通信能力 TTIoT简介 TTIOT的Broker采用MQTT协议与设备进行交互,可以应用在数据采集.能源监控.智能生活. ...
- java netty socket_Netty对socket的抽象
传统socket 首先还是先了解下传统socket下的通信流程 流程很清晰,细节不讲太多. Netty抽象 在netty中步骤1监听端口对应就是NioEventLoop,即事件循环,这里的循环包括两个 ...
- java netty modbus协议接收iot数据
IoTserver 源代码开源在gitee上 : IoT netty java gitee server sample c++ libuv 的IoT tcp server IoT c++ libuv ...
- java netty能做什么_开发:Netty快速入门,一看就懂!
很早以前就写过关于 Netty 的使用,最近发现还有网友在看之前写的那篇 Netty 文章,个人感觉那时候写的很粗糙,怕影响同行的阅读质量,所以决定重新写一些关于 Netty 的文章,补充以前的不足. ...
- java fragment_初步认识Fragment 之一 编写简单的fragment代码
今天初步学习到了Fragment ,如果说activity是一堵墙, 那么它类似于一个便利贴,能将内容写在上面粘贴到任意一面墙上, 而不需要每一堵墙上都写满相同的内容 , 下面我们来了解 怎样编写 F ...
- Java Netty (1)
Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的封装,比NIO更加高级,功能更加强大.可以说发展的路线是IO->NIO->Netty. ServerBoo ...
最新文章
- Sencha Touch 2 DataView / List 分页
- Centos6.5 安装配置docker
- 模组使用之NB-IoT模组的工作模式、PSM、DRX和eDRX状态说明
- Android持久化存储(2)SharedPreferences使用介绍
- (王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题
- 微信开源项目讲解使用公开课
- 学习笔记之awk用法
- Tensorflow结点打包和依赖控制
- linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
- Angular 分页
- 计算机的DNS地址如何设置,如何设置电脑的DNS地址?
- 万字讲解WiFi为何物
- 总结一下关于扫描电子显微镜与背散射电子探测器
- Android--设置显示大小导致APP crash
- C++ Tetris俄罗斯方块
- php 计算字数,实现word一样的字数计算
- IDEA类左侧有一个对勾,如何去掉对勾?
- ubuntu16.04 basler相机 图像采集卡设置
- VS2015正式版出炉-----
- 鸿蒙之境法有三乘,神都夜行录鸿蒙之境八百流沙详细打法攻略
热门文章
- x[:,n]或者x[n,:]的用法
- python实现判断一个字符串是否是合法IP地址
- 2021-08-13 初识servlet
- 2021-07-07 分类页面结构
- java arraydeque poll,Java ArrayDeque pollLast()方法
- 施密特正交化_夜思 | 为什么非实对称矩阵对应的特征向量不能施密特正交化?...
- solidity import @是什么意思
- 不经意传输算法 效果
- API 接口 并发测试 Jmeter Postman
- 将solidity智能合约打包成Java代码