`

非阻塞式网络通信

阅读更多

年前的时候一直在做架构方面的工作。实际上就是规划客户端的程序结构。

一般的网络请求的客户端采用“一对一”的形式。即开始网络请求,类似于网络浏览器,在请求新的结果时,需要先取消前一个网络请求。这样的过程对于早先的手机客户端是可以接受的。随着手机客户端逻辑越来越复杂,这种单一的请求模式必然不能满足需要。因此,原浏览器式的请求需要改进。

在做改进的时候,开始研究底层的通讯代码,发现此代码与网上的比较火的google浏览器写法极其相似。采用任务列表的方式,将所有的动作(函数)作为指针发送到任务处理中心,任务处理中心依次处理这些任务。此方法将多线程的通讯过程简化到一个单线程中,比较给力。

但是这个程序写的太复杂了,看了好久才懂,出了问题都不敢乱改。因此还是不想用此代码。

一直尝试这样的架构,网络层来数据收就好了,客户端需要数据请求就好了,等数据来了,再显示出来,发送和接收完全分离。

最终还是需要网络模块给力才行。以前写过阻塞式的通讯模块。大致思路为每个连接两个线程,一个线程用来发送,一个线程用来接收数据。对于客户端而言,连接和发送为同一个线程。

客户端:

用一个类TcpSocketClient来封装客户端的相关信息,每个类实例表示一个连接,可以考虑用同步连接的形式完成连接,连接完成后进行数据的发送。在连接完成后,需要通过WSAEventSelect进行事件的注册。然后开启一个事件响应线程,在那儿进行数据的接收。

为了提高效率和简化外界的使用,可以在外面加一层包装类TcpSocketPool,此类是一个连接池,当发现存在可以重复使用类实例时(这些类实例是由于连接断开,为了重复利用没有被销毁,便可以直接使用旧有的连接实例,而无需创建新的实例,减少了重复创建和销毁的开销。

可以固定下与外界的接口。HRESULT Write(const char* addr, int port, const char* data);这样,当需要发送给指定服务器数据时,直接通过此函数进行,由它去检查是否已经完成连接,未完成连接,则先进行连接操作。

服务器:

用一个类来封装服务器的相关信息,一个类实例用来处理一条连接。第一个实例用来侦听,从第二个开始来进行数据的传输。每一个实例产生一个事件线程。第一个实例专用来侦听accapt事件,发现有新的连接,则创建一个新的实例,以完成后续的数据的接收和发送。

分享到:
评论

相关推荐

    多路转接之select(fd-set介绍,参数详细介绍),实现非阻塞式网络通信

    多路转接之select(fd-set介绍,参数详细介绍),实现非阻塞式网络通信

    java非阻塞式的通信

    总之,非阻塞式通信是Java网络编程中的一个重要概念,它改变了传统阻塞式I/O的局限,为开发者提供了更高效、更灵活的网络编程模型。通过理解和掌握`java.nio`包中的关键类与接口,可以有效提升Java网络应用的性能和...

    MFC实现非阻塞Socket通信

    在IT领域,网络通信是不可或缺的一部分,而MFC(Microsoft Foundation Classes)库为Windows应用程序开发提供了强大的支持。本文将深入探讨如何使用MFC实现非阻塞Socket通信,并结合protobuf(Protocol Buffers)...

    非阻塞式编程

    非阻塞式I/O在高并发服务器、网络编程、实时系统等领域有着广泛的应用,例如在开发高性能的Web服务器、数据库连接池以及网络通信软件时,非阻塞I/O可以显著提升系统处理能力。然而,它也增加了编程复杂性,因为程序...

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    - **Socket**:是网络通信的一种抽象表示方式,它提供了一种进程间通信机制。 - **Winsock**:是微软提供的Windows平台下的网络编程接口。 - **TCP**:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层...

    android开发进阶之NIO非阻塞包

    2. **SocketChannel**:用于实现客户端与服务端之间的非阻塞式网络通信。例如,创建一个非阻塞的`SocketChannel`: ```java SocketChannel socketChannel = SocketChannel.open(); socketChannel....

    STM32H7 LWIP Rev非阻塞方式

    开发者可以通过分析和学习这个文件,更好地理解和应用STM32H7上的LWIP非阻塞网络通信。 总之,STM32H7结合LWIP的非阻塞方式,能够有效提高嵌入式设备的网络性能,同时降低CPU的闲置率,这对于需要高效处理网络请求...

    非阻塞模式网络聊天应用程序

    非阻塞模式网络聊天应用程序是一种高效且现代的通信软件设计方式,它主要利用了计算机网络编程中的非阻塞I/O模型。在这个模型中,当一个I/O操作(如读取或写入数据)不能立即完成时,程序不会被挂起等待,而是继续...

    [转载] 多线程阻塞式网络编程socket_源代码

    在IT领域,网络编程是构建分布式系统的基础,而Socket编程是网络编程的核心部分。...在实际开发中,根据具体需求,可能会考虑优化为非阻塞式、异步或者复用已存在的线程池,以进一步提高系统的性能和资源利用率。

    java点对点聊天(非阻塞式网络编程)

    Java点对点聊天系统是基于非阻塞式网络编程实现的一种通信方式,它允许两个或多个用户通过互联网直接交换信息,而无需通过中央服务器作为中介。这种技术在现代分布式系统和实时通信应用中广泛使用,如VoIP服务、即时...

    精讲响应式webclient-响应式非阻塞IO与基础用法.docx

    非阻塞的响应式IO模型,如WebClient采用的,借鉴了如Netty这样的高性能网络通信框架。在这一模型中,请求处理和线程交互更为高效,通过事件驱动和回调机制,可以显著提高并发处理能力,而不仅仅是单一请求的响应速度...

    非阻塞tcpip通讯

    非阻塞TCP/IP通信是一种高效的网络编程模型,它在处理大量并发连接时具有显著优势。在传统的阻塞模式下,一个套接字调用(如recv或send)会一直阻塞,直到有数据可读或发送空间可用。然而,在非阻塞模式下,这些调用...

    java实现的非阻塞Http服务器文档和源码

    非阻塞模式提高了服务器处理并发请求的能力,降低了资源消耗,特别适合于网络通信和大数据处理场景。 Java NIO(New Input/Output)库自Java 1.4版本引入,为开发者提供了非阻塞I/O的支持。NIO的核心组件包括选择器...

    Python实现socket非阻塞通讯功能示例

    Python提供了内置的socket模块,允许程序员创建和使用socket来进行网络通信。 在非阻塞通信模式下,socket操作不会使程序暂停,而是立即返回操作结果。如果此时资源未准备好,会返回一个特定的错误码或异常,提示...

    visual C#网络编程(郑阿奇编)异步通信程序的源代码

    在这个场景下,“异步通信程序的源代码”是指使用C#实现的非阻塞式网络通信模式,这种模式在处理大量并发连接或执行长时间运行的操作时特别有效。 异步编程是C#中的一个关键特性,它允许程序在等待某个操作完成时...

    同步、异步、阻塞、非阻塞的区别

    **同步**和**异步**是计算机编程中非常重要的概念,尤其是在多线程编程、网络通信以及操作系统中有着广泛的应用。这两个概念主要涉及的是**消息的通知机制**。 1. **同步**:在这种情况下,消息的发送者必须等待...

    非阻塞聊天程序

    非阻塞聊天程序是一种设计...总之,非阻塞聊天程序通过Java NIO技术实现了高效的网络通信,能够在处理大量并发连接时保持高性能,为用户提供流畅的聊天体验。理解并掌握这些知识点对于构建大规模的分布式系统至关重要。

    VS2015-Socket非阻塞式文件传输

    本项目"VS2015-Socket非阻塞式文件传输"利用Visual Studio 2015开发环境,实现了非阻塞式的Socket文件传输功能,支持包括jpg、mov、iso等多种常见文件格式的传输。下面将详细介绍这一技术及其相关知识点。 首先,...

    Delphi.rar_delphi

    Indy是一个开源的互联网协议组件集,而Synapse则是一个强大的非阻塞式网络通信库,两者都能帮助开发者轻松处理客户端和服务器之间的数据传输。 聊天狗小程序可能会包含以下几个主要部分: 1. 用户界面:登录/注册...

Global site tag (gtag.js) - Google Analytics