软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 架构设计 -> Netty入门到精通一 -> 正文阅读

[架构设计]Netty入门到精通一


 因为一次工作需要,要从华为的一个区跑到另一个区开会,我终于见到了我心目中的大神(李林锋:Netty中国推广者,现华为技术有限公司平台中间件架构与设计部设计师),喜欢技术的我迫不及待的和他交流了起来,大神的技术果然牛逼,小弟膜拜中,大牛给我讲解了很多设计思想,在我遇到大部分开发者中,大多交流技术,用了什么什么技术,然后觉得很牛逼,经过和大牛交流后,才明白设计思想很重要,很多人注重用神马神马框架,神马神马技术,却不知道框架设计思想,为什么这么设计,这或许就是设计师和码农的区别吧(本人也只敢称自己是码农( ><),和大神交流后感觉自己弱爆了),一个好的产品是有设计思想和灵魂的,好吧这里我们就不扯蛋了。
     好吧说说我为什么写下这篇文章吧,因工作需要,本人需要用到Netty,正好遇到了些问题,这是我就想起了大神,大神太忙了等了许久才回了我邮件(华为内部邮箱,华为内部不允许上网( ><) ),下班后在网上找了一些资料,发现大多要不不是很全,要不就很笼统,让人不好理解,看电子书很蛋疼吧,领导还安排有别的任务呢,再说相信对于初学者来说也遇到不少问题吧,然后自己资料整理了一下,写下此文章,本人会不定期的更新Netty文章,所以要有耐心一点,最好关注一下我的微博,当然心急吃不了热豆腐,有神马技术上的问题也可以一起交流,本人CSDN博客Jimmy_zjf888,觉得写的不错的给个赞,送上鲜花,当然写的差的别吐槽丢大便就好。
 首先我们要知道神马是Netty,我们为什么要用Netty,Netty的优势是神马?

 Netty 是一个基于 JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性,那么NIO和传统IO有神马区别呢?下面我们来看看代码吧,这里的客户端和服务端我就用公司前台和参观客户做例子吧.

/**
 * 传统socket服务端
 * @author -Jimmy_zjf888-
 *
 */
public class OrdinaryServer {
public static void main(String[] args)throws Exception {
//创建socket服务,打开并监听8888端口
ServerSocket server=new ServerSocket(8888);
while(true){
//获取一个套接字(阻塞)
final Socket socket = server.accept();
System.out.println("来个一个新客户!");
//前台妹子给客人端茶倒水
handler(socket);
}
}
/**
 * 读取数据
 * @param socket
 * @throws Exception
 */
public static void handler(Socket socket){
try {
byte[] bytes = new byte[1024];
//获取socket的一个输入流
InputStream inputStream = socket.getInputStream();
while(true){
//循环读取读取数据(阻塞)
int read = inputStream.read(bytes);
if(read != -1){
System.out.println(new String(bytes, 0, read));
}else{
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
 
我们运行一下如上代码,打开debug模式
[img]http://img.blog.csdn.net/20160403153236135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


哎哟一开始就发现final Socket socket = server.accept();代码执行到这一句的时候就开始阻塞了,这时我们用控制台的telnet去模拟吧
[img]http://img.blog.csdn.net/20160403153330619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

,然后回车,发现代码往下执行了,哎哟发现int read = inputStream.read(bytes);执行到这一句就阻塞了
[img]http://img.blog.csdn.net/20160403153421979?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


总结了一下传统的IO2个阻塞点一个系server.accept()的时候阻塞,另外一点系
nputStream.read(bytes)的时候阻塞,如果这么阻塞下去,如果有别的客人也来咱们公司参观的话,是不是那个前台妹子就不能照顾那个客人了?对没错的,我们再telnet一下试试
[img]http://img.blog.csdn.net/20160403154101747?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center[img]http://img.blog.csdn.net/20160403154113075?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center



发现有新的客人来的时候我们的前台,只能照顾不周了,因为她在忙着照顾她第一个客人,那么我们该怎么办呢?是不是得多招几个前台妹子啊?听到这里有点小激动,又招妹子了,来看看怎么实现把,首先我们需要一个前台管理员,当客人来的时候能够负责分配空闲的前台去照顾客人对吧,代码如下。。。
public static void main(String[] args)throws Exception {
//创建一个线程池
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
//创建socket服务,打开并监听8888端口
ServerSocket server=new ServerSocket(8888);
while(true){
//获取一个套接字(阻塞)
final Socket socket = server.accept();
System.out.println("来个一个新客户!");
//派送空闲的前台妹子去接待客人
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
//前台妹子给客人端茶倒水
handler(socket);
}
});
}
}
运行代码看看有没有像我们想象中的那样能够解决问题,
[img]http://img.blog.csdn.net/20160403154150748?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://img.blog.csdn.net/20160403154200857?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


我们再来一次,看看问题还会不会存在
[img]http://img.blog.csdn.net/20160403154241310?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://img.blog.csdn.net/20160403154254498?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


我们总结一下,单线程情况下只能有一个客户端,多线程的情况下可以有多个客户端,但非常消耗内存(要招很多前台妹子,公司的资源是有限的,不能不停招前台,虽然对咱们程序猿来说是福利,但对公司来说就是一笔不小的开资,那么我们应该怎么办呢?请看下篇)
......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:42:58  
架构设计 最新文章
Opengl教程之读取obj并绘制在picturecontro
读《企业应用架构模式》第五章并发
StepbyStepintoSpring(IOC)
设计模式(2)用例图之一
使用实体组件系统(ECS)开发”吃方块”游戏实
编程学习之简单工厂模式与策略模式
Invalidprojectdescription.
基于Redis实现分布式消息队列(2)
《开源框架那点事儿15》:借船下海还是造船
原型模式——浅复制和深复制
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-17 9:25:29
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --