美文网首页Netty框架源码分析
3.Netty框架-网络IO编程模板(BIO编程模型)

3.Netty框架-网络IO编程模板(BIO编程模型)

作者: 还算年轻 | 来源:发表于2020-08-06 10:23 被阅读0次

    一、BIO通信模型:

    BIO带来的问题:

        从服务端代码中我们可以看到,在传统的IO模型中,每个连接创建成功之后都需要一个线程来维护,每个线程包含一个while死循环,那么1w个连接对应1w个线程,继而1w个while死循环,这就带来如下几个问题:

        线程资源受限:线程是操作系统中非常宝贵的资源,同一时刻有大量的线程处于阻塞状态是非常严重的资源浪费,操作系统耗不起

        线程切换效率低下:单机cpu核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降。

        除了以上两个问题,IO编程中,我们看到数据读写是以字节流为单位,效率不高。

        为了解决这三个问题,JDK在1.4之后提出了NIO。

    二、伪异步IO通信模型:

    三、Socket通信模型:

    一、什么是socket?

    TCP/IP 结构:

    Socket是什么呢? 

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 

    一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。 

        先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    Socket解决了什么? 

    1、网络中进程之间如何通信? 

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类:

    消息传递(管道、FIFO、消息队列) 

    同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量) 

    共享内存(匿名的和具名的) 

    远程过程调用(Solaris门和Sun RPC) 

    网络的进程间通信:

    首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

    使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。

    四、BIO阻塞在哪里:

    相关文章

      网友评论

        本文标题:3.Netty框架-网络IO编程模板(BIO编程模型)

        本文链接:https://www.haomeiwen.com/subject/nbhyrktx.html