tcp异步机制

前面关于socket的编程,全部是基于同步机制开发的服务器和客户端,线程会进入阻塞或者挂起状态,降低线程利用率,同时程序影响效率。因此,向tcp程序引入异步回调:在异步套接字完成网络操作后,线程没有被阻塞或者挂起,接着通过调用回调函数处理后续网络操作。而主线程继续执行,以实现并行执行的结果。

为什么要引入异步机制?

看到过一个解释。当我们打开一个程序时,鼠标不停地转但是就是不见界面跳转,这是其他耗时操作阻碍了ui线程,造成ui线程不能响应用户操作。如果引用异步机制,ui线程在发起耗时操作之后马上回来响应用户操作,把能响应的都给用户,最后等耗时操作结束,通过回调来处理耗时操作的结果。这就是异步机制能快速响应用户界面,还有更高的伸缩性(线程池更加灵活分配利用数量有限的线程)

什么是回调函数?为什么要用回调函数?

简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调常常是异步调用的基础,即回调用于通知机制。具体看http://www.cnblogs.com/swordzj/archive/2007/04/24/2034769.html。委托就是C++的函数指针,即回调机制;就是Java的监听器:所有提供功能待植入的机制都要用到它。

异步回调代码例子如下:

sever.BeginAccept(new AsyncCallBack(Accept),server);//server是一个Socket对象

void Accept(IAsyncResult iar)

{

Socket oldserver=(Socket)iar.AsycState;

service=oldserver.EndAccept(iar);

}

从代码看出,其实异步回调就是把回调函数Accept的函数地址以及函数要用到的信息的对象通知给BeginAccept,告诉BeginAccept当你执行结束的时候只要有这两样东西给我,你就能委托系统就能用我(Accept),而异步就体现在BeginAccept和委托函数AsyncCallBack

有了前面的基础概念,就可以开始开发基于tcp的异步通信程序了。由于程序有界面还有数据通信,并且通信获得的数据要显示在界面上,所以应该选用回调机制来实现,它需要多线程、委托、异步调用等概念。

原文:https://blog.csdn.net/yuyin86/article/details/7765882

原文地址:https://www.cnblogs.com/jiangyu0331/p/12000724.html

时间: 2024-10-16 15:11:17

tcp异步机制的相关文章

Java TCP异步数据接收

之前一直采用.Net编写服务端程序,最近需要切换到Linux平台下,于是尝试采用Java编写数据服务器.TCP异步连接在C#中很容易实现,网上也有很多可供参考的代码.但Java异步TCP的参考资料较少,网上例程多是阻塞多线程方法,由于线程的开销较大,当客户端较多时系统资源的消耗也较大. 综合网上和书本的相关知识,本文给出一个Java TCP异步接收数据的代码示例,并给出相关的注释. /** * TcpAsyncServer.java */ import java.nio.ByteBuffer;

一种C# TCP异步编程中遇到的问题

最近在维护公司的一个socket服务端工具,该工具主要是提供两个socket server服务,对两端连接的程序进行数据的透明转发. 程序运行期间,遇到一个问题,程序的一端是GPRS设备,众所周知,GPRS设备的网络连接十分的不问题,由此会产生不少的"奇怪"问题.实际过程中,程序运行几个小时后,无线端的socket server断开就再也无法打开.找了很久都没发现. 通过wireshark抓取通信报文,一般是在TCP的三次握手时出的问题.常规的TCP三次握手,由TCP的标识可简单看作:

JavaScript单线程和异步机制

随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时是单线程的.嗯,就这么点印象.当时也有些疑问:既然是单线程的,那异步调用是怎么实现的?计时器是靠谁来计时的,这单线程总不能一边执行程序一边计时吧?那些耗时的I/O操作为啥没把线程阻塞,不是说好的单线程么?相信很多不了解JavaScript单线程的同学也有过类似的疑问. 今天看了不少相关的资料,就详细

同步机制与异步机制的理解

同步机制与异步机制的理解 同步机制即在进行输入输出时,必须等待输入输出完毕后,才能进行后面的操作. 异步传输机制就不必等待完毕就可进行其它操作. 网络上有一个比较通俗的例子:请吃饭 同步就是我叫你吃饭,你听到了就立刻跟我去,若你没有反应,那我就不停的叫你,直到你回应.(同步的特点是我不能做其他任何的事情,专心等你...个人觉得女生肯定希望遇到此类的男生吧...) 异步就是我叫了你,然后我就去吃饭了,不管你听没听见.(异步的特点是不会等待正在执行的事件结束,他就可以执行其它的事件). 看了别人的帖

JavaScript异步机制

单线程异步执行的JavaScript JavaScript是单线程异步执行的,单线程意味着代码在任务队列中会按照顺序一个接一个的执行.异步代表JavaScript代码在任务队列中的顺序并不完全等同于代码的书写顺序,比如事件绑定.Ajax.setTimeout()等任务的发生时间是“不可被预期”的. 既然JavaScript是单线程机制,那Ajax为什么是异步的?setTimeout()是怎样执行的? 在浏览器中,JavaScript引擎是单线程执行的.也就是说,在同一时间内,只能有一段代码被Ja

基于C#的socket编程的TCP异步实现

一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器.相对地,在异步模式下,服务器可以使用BeginAccept方法和EndAccept方法来完成连接到客户端的任务,在客户端则通过BeginConnect方法和EndConnect方法来实现与服务器的连接. BeginAccept在异步方式下

对Node.js的异步机制的思考

Node.js的异步机制是其最大的特色,异步可以应对高并发,具有很好的性能. 但是如果在某个方法里,涉及到数据库的多层查询,异步机制反而成为阻碍.当执行完第一层SQL后,根据所得的结果集(rows)进行结果集进行遍历时,每次遍历的结果作为where条件再执行下一层SQL时,下一层及以后的SQL并不会执行,而是在结果集(rows)遍历到最后时,才执行下一层SQL. 这时,若SQL只有两三层,其实倒还好,可以合并SQL:但是SQL层数多了之后,这种异步机制却是最大的阻碍.这时,就需要用到Node.j

[转]JavaScript异步机制详解

原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------------------------- 学习JavaScript的时候了解到JavaScript是单线程的,刚开始很疑惑,单线程怎么处理网络请求.文件读写等耗时操作呢?效率岂不是会很低?随着对这方面内容的了解和深入,知道了其中的奥秘.本篇文章就主要讲解一下JavaScript怎么处理异步问题. 一.同

异步机制

Linux 内核中使用到异步机制的地方: 信号,这是一种进程间通信的异步机制 [通信] epoll,这是一种高效I/O的异步通信机制 [I/O] 信号的本质: 软中断信号(signal,又简称为信号),用来通知进程发生了异步事件.在软件层次上,信号是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程通信机制中唯一的异步通信机制.(一个进程不必通过任何操作来等待信号的到达,进程也不知道信号到底什么时候到达) 进程收到信号后,有3种处理方法: 1.