Android开发之使用Netty进行Socket编程(一)

一些基本概念

1 Socket

1) 同一个名词Socket有多种不同意思。
2) 在计算机网络知识体系中,运输层的TCP(传输控制协议)把连接作为最基本的抽象。TCP的连接有两个端点,被称为Socket,通过IP地址+端口号来区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。Client进程和Server进程之间是通过Socket读写数据进行通信的。
3) JDK的java.net包下有两个类:SocketServerSocket,在Client和Server建立连接成功后,两端都会产生一个Socket实例,操作这个实例,完成所需的会话,而程序员就通过这些API进行网络编程。 Socket连接过程分为三个步骤:服务器监听,客户端请求,连接确认。需要注意的是,Socket自己并不是一种协议,而是对TCP/IP协议的抽象,并提供最基本的函数接口方便开发者调用。

2 Netty

Netty.io官网介绍:
Netty是一个异步非阻塞的事件驱动型的网络应用程序框架。满足高性能协议服务器和客户端的快速发展需求。
Netty是一个高性能、方便开发的NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty大大简化了网络编程比如TCP和UDP的 Socket的开发。
“快速和简单”并不意味着应用程序会有难维护和性能低的问题,Netty是一个精心设计的框架,它从FTP、SMTP、HTTP、许多二进制和基于文本的传统协议实现中吸收了经验,为我们提供了一个高开发效率、高性能、稳定、可伸缩的解决方案。

3 NIO

刚刚提到:

Netty是一个NIO框架。

理解NIO框架的基本概念有助于学习Netty提供给开发者使用的API。
NIO 是jdk1.4 里提供的新API,全称即java new I/O。Sun 官方标榜的特性如下: 为所有的原始类型提供缓存(Buffer)支持。
首先我们来回忆一下Java的IO

  1. IO可以简单理解为 数据流方向:程序→硬盘写数据(Output)以及 硬盘→程序读数据(Input),同时Java IO是基于流(Stream)的,所有的API都继承自InputStream/OutputStream。意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。
  2. IO的过程是阻塞的,也就是说当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

然后我们再来看NIO:
NIO包括三个核心:

  • Channels
    FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
    Java NIO的通道类似流,但又有些不同:
    1)流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类),而通道可以用于读、写或者同时用于读写,是全双工的。
    2)通道可以异步地读写。
    3)通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
    Channel

    实际上Channel可以分为两大类,分别是用于网络读写的SelectableChannel和用于文件操作的FileChannel
    Netty中ServerSocketChannel和SocketChannel都是SelectableChannel的子类
  • Buffers
    所有数据都是用缓冲区进行处理的。在读取数据时,它是直接读到缓冲区中;在写入数据时,它也是写入到缓冲区中。任何时候访问 NIO 中的数据,我们都是通过缓冲区进行读写操作。
    缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
    NIO中Buffer的实现包括ByteBuffer、CharBuffer、DoubleBuffer等等,这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。
Buffer
  • Selectors
    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。
    Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。
    Selector

    Selector会不断的轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合进行后续的IO操作。

所以,与IO相比,

  1. NIO是从缓冲区(Buffer)读写数据的,而不是面向流(Stream)。例如在读取硬盘数据时,并不是仅从一个InputStream上逐字节读取,而是数据必须先读入缓冲区再处理。
  2. NIO在一个线程从某通道发送请求读取数据,并不会保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

最后

抱歉这是一篇搬运后排版出来的文章,花了点时间整理了下Netty框架相关的知识。尤其是NIO这一块,虽然网上的言论都是不建议直接基于JDK的NIO类库进行开发,几乎都推荐使用Netty开发NIO服务端,但是了解NIO的一些核心概念,肯定有助于对Netty整个代码模式以及API使用的学习。这两天会再整理一下在Android客户端开发中Netty的具体使用。

相关链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容