在传统的网络编程中我们依赖于ServerSocket,Socket进行通信,大致的框架就是ServerSocket调用accept方法,等待客户端的连接,如果连接进来的时候则创建一个服务器端socket,客户端和服务器端socket建立好InputStream 和outputStream通道进行通信,在这个网络IO的过程中inputStream的read 和outputStream的write方法都可能发送阻塞。为了减少这种阻塞对其他连接的影响,一般都会在服务器端为每个连接开辟一个新的线程,或者使用线程池技术来避免线程的创建销毁同时又一定程度支持并发量。然而这种情况下,如果发生大量的read 或者write阻塞线程池的效率会大大降低,而且操作系统也额外需要频繁的处理cpu的切换。阻塞式通信模式大致如下图所示。
非阻塞式通信实际是对上述模式的扩展,它的核心思想是为传统的socket加入事件监听的功能,操作系统可以在socket和serversocket上进行事件监听,一旦监听的对象发生了连接和可读可写的事件,监听器就会对注册了事件的对象返回相应的通知。在javaNIO中实现这一套的机制就是把socket 和ServerSocket重写成为SocketChanel,ServerSocketChanel,他们的底层仍然使用socket实现,所以原则上javaNIO包可以完全实现阻塞和非阻塞两种编程模式。事件监听的功能由Selection类完成,他使用select方法一直阻塞式监听注册了的事件是否发生,对于每一个发生的事件,他都会返回一个selectionKey,通过这个key我们就可以确定这个事件的发生源(socket)和相关信息。对于ServerSocketChanel,Socketchanel分别对应了不同的事件,serverChanel只有OP_ACCEPT代表是否可以接受连接,而socketChanel则有OP_CONNECT、read、write事件。笔者认为与阻塞IO相比他的优势在于可以避免read 和write的阻塞,因为这个比较具有实际意义的。比如是一个网络文件传输系统,read方法可能会因为网络原因发生多次阻塞,使用非阻塞IO read的话线程可以立即返回去处理其他任务。非阻塞式编程框架如下图所示
在具体的网络程序实现中,可以使用阻塞模式,也可以使用非阻塞或者混合模式。阻塞模式配合线程池技术实际上可以处理大部分发送小批量数据的需求,因为不会很频繁的发生read或者write阻塞,而是用非阻塞加线程池的技术对于发送大批量数据的程序则更有优势了。当然非阻塞式编程处理起来难道比较大,一方面对bytebuffer的操作相对繁琐,另一方面,某个数据的发送可能会触发多次的readable事件,这都需要在receive程序里进行额外编程来保证数据的完整性的。
相关推荐
非阻塞式I/O在高并发服务器、网络编程、实时系统等领域有着广泛的应用,例如在开发高性能的Web服务器、数据库连接池以及网络通信软件时,非阻塞I/O可以显著提升系统处理能力。然而,它也增加了编程复杂性,因为程序...
在Windows平台上进行网络编程时,Socket是至关重要的通信机制。Socket接口提供了丰富的API,使得开发者可以构建客户端和服务端应用程序,实现数据的传输。本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种...
通过java网络编程深入理解socket阻塞通信和非阻塞通信的在网络中的应用 源码包每一行都有注释,在代码里面每一个类都有详细的注释来解释这个类的功能这个方法的功能,调用哪一个类的哪一个功能等等。 压缩包包含实验...
在进行网络编程时,选择合适的通信模式取决于应用的需求。对于需要高效处理大量并发连接的场景,非阻塞模式与事件驱动编程是更好的选择。而对于简单且对实时性要求不高的应用,阻塞模式则相对易于实现。了解和掌握这...
开发者可以通过分析和学习这个文件,更好地理解和应用STM32H7上的LWIP非阻塞网络通信。 总之,STM32H7结合LWIP的非阻塞方式,能够有效提高嵌入式设备的网络性能,同时降低CPU的闲置率,这对于需要高效处理网络请求...
首先,理解非阻塞网络编程的概念是至关重要的。在传统的阻塞I/O模型中,当一个线程尝试读取或写入数据时,如果数据尚未准备好,线程会进入等待状态,直到数据可用。这导致了资源的浪费,因为线程在等待期间无法执行...
总结,C++ Socket编程中的阻塞与非阻塞模式选择取决于具体需求,如对实时性、响应速度或资源利用率的要求。多线程技术可以帮助提高服务器处理并发请求的能力,而定时清除连接资源则是保持服务器高效运行的重要策略。...
在计算机网络编程中,I/O模型的选择对程序的性能和响应速度有着显著影响。本篇文章主要探讨了I/O阻塞与非阻塞操作的应用,以及socket多路复用技术,包括socket信号驱动、UDP广播与组播通信。这些概念和技术在开发高...
### Socket C++ TCP阻塞与非阻塞服务器客户端开发 #### 概述 本文档将详细介绍如何使用C++ Winsock库来开发TCP非阻塞服务器。通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解...
非阻塞TCP编程是计算机网络通信中的一个重要概念,特别是在高并发和实时性要求较高的系统中。在传统的TCP编程中,通常使用阻塞模式,即一个线程在等待数据到达时会被挂起,直到数据到达才会继续执行。然而,这种模式...
Socket编程在IT领域中是网络通信的基础,尤其在C++编程环境下,利用VC++6.0这样的集成开发环境,开发者可以构建...通过对源代码的分析和实践,开发者能够提升自己的网络编程技能,为构建更复杂的网络应用打下坚实基础。
### 非阻塞异步传输Java网络编程 #### 实验背景及目标 本实验旨在通过Java语言实现一种基于自定义协议的文件传输系统,包括一个文件传输服务器(FileServer)和一个客户端(FileClient)。该系统的特点在于采用了非...
在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux环境下,针对UDP Socket设置为非阻塞模式和阻塞模式的具体差异,以及它们...
全面理解 Java 网络编程 - BIO、NIO、AIO 本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO...
非阻塞模式在网络编程中是一种重要的设计模式。在阻塞模式下,当一个socket调用(如recv或send)执行时,如果数据尚未准备好,那么程序会暂停,等待数据的到来。而在非阻塞模式下,这些函数会在没有数据可读或无法...
在IT领域,网络通信是不可或缺的一部分,而MFC(Microsoft Foundation Classes)库为Windows应用程序开发提供了强大的支持。...这个系统具有良好的可扩展性和性能,是现代网络编程的一个重要实践。
例如,在网络编程中,非阻塞I/O可以在数据没有完全到达时就返回,而不是等待所有数据到达。这种方式提高了效率,但需要更复杂的编程策略来处理可能的失败情况,如空读或空写。 **异步与阻塞/非阻塞的结合** 异步...
对于初学者,使用MFC的CAsyncSocket类可以简化网络编程,因为它已经封装了异步非阻塞的功能。然而,为了深入理解这些概念,直接使用Winsock2 API是更推荐的方法。这样可以更好地掌握异步非阻塞套接字的工作原理。 ...
此外,书中还涉及到网络编程的高级主题,如多路复用技术、非阻塞套接字的使用、以及select和poll机制等。 第三版相较于第二版增加了很多新的内容,包括对IPv6的支持、新的网络编程APIs以及对多线程编程的讨论等。...
本压缩包中的资源聚焦于“非阻塞”模式的`socket`编程,这是一种高级网络编程技术,可以提高服务器的并发处理能力。 非阻塞`socket`是指当调用`recv()`或`send()`函数时,如果数据未准备好或者缓冲区满,不会使程序...