Netty学习(1)

其实到这家公司也有一段时间了,现在的公司是个做通信的公司,所以有一些知识不得不去学习。

刚来不久就要求用netty做一个通信的模拟。我来这个公司之前连socket是什么都不知道,突然有点想要放弃,但是既然来了便也希望能够安下心去学习些东西好好工作。

既然不得不学习了,那也只有硬着头皮去扣了。这里只是我对自己的一个知识梳理。
首先是SOCKET:
我的理解,就是描述ip地址,端口号的,服务端监听,客户端生成socket连接服务器,服务端生成一个socket,就可以进行通信了。

然后是NIO:
NIO有四大主要概念:Channel, Selector, SelectionKey, Buffer。Netty中同样也少不了这些,并且出于性能和设计上的考虑,对它们进行了扩充。比如netty的buffer包,重新定义了Buffer,提供了各种各样的实现,比jdk中自带的Buffer更加高效与好用。举例来说,jdk中的buffer在读完数据写之前,必须调用一个flip()方法,否则数据出错但不报错,这很容易引起bug。而Netty的Buffer中增加了一个write index,将读写分开,解决了这个问题。另外,jdk的buffer是固定的,而netty还提供了一个可变长的buffer,方便操作。而Channel在Netty中也重新设计,提供了很多种Channel,照顾到不同程序的需要。而Selector和SelectionKey,还是使用jdk自己的。

重要的地方,是Netty定义了很多事件,如connected, messageReceived, messageSent等等。我们可以继承一个Handler,来实现对应的操作,它们将在对应事件发生的时候,被自动调用。这就是“事件驱动”。

为了简化操作,我们还可以使用Encoder和Decoder将传送于网络间的二进制数据与我们操作的pojo进行互转,这样在程序中无须直接操作底层数据。

Netty提供了不少协议的实现,如http等,让Netty有了初步的处理http请求的能力。其http的encoder和decoder,在底层处理http请求的交互数据,将其变为了request, cookie, response等对象。因此现在有很多web框架尝试将Netty作为自己内嵌的http服务器,以达到更佳的性能与方便的操作。不过据我观察,Netty提供的支持还比较简单(如request, response等类中,方法很少),如果真要使用,还需要对它进行扩展。

Netty使用一个Boss线程来处理新连接,而将数据读取和处理等,分给若干个Worker线程。它在内部其实还是使用了“轮询”,去调用selector.select()得到可用事件,最终转变为对Hander中相关回调方法的调用。

我对NIO的理解:
四大概念。对于io操作增加了buffer缓冲区,还有就是一个非阻塞。
非阻塞:应该就是如果有数据什么的需要处理,相应的事件驱动会被调用,不需要轮询。
 
Channel、Buffer

 

Selector:这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

你可能感兴趣的:(netty)