`
qqd911mu
  • 浏览: 10297 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

长连接,短连接,同步,异步

 
阅读更多

长连接,短连接,同步,异步
2010年09月27日
  什么是长连接?
  其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。
  通常的短连接操作步骤是:
  连接-》数据传输-》关闭连接;
  而长连接通常就是:
  连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;
  这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了
  什么时候用长连接,短连接?
  长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。
  但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。
  总之,长连接和短连接的选择要视情况而定。
  一般在java上代码实现是
  短连接:   
  run(){   
  read           //读取请求包   
  process     //处理   
  write         //应答处理结果   
  }   
  长连接:   
  run(){   
  while(NotEnd){   
  read   
  process   
  write   
  }   
  }
  以下是关于长连接中的检测保持连接的心跳比喻
  连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
  长连接:系统通讯连接建立后就一直保持。
  短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;
  通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。
  具 体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也就 相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.
  所以长短连接只是一个概念问题长短连接的socket,就是使用普通的socket函数,没有什么特殊的。
  最后,关于同步与异步
  同步操作指上一个操作返回结果后才能发下一个操作的数据包
  异步操作指先把所有的操作数据包发完后 再等待它们的返回结果
  相比较看 异步操作速度快 特别是在每个包处理方法独立的情况下 异步操作一般提供两个端口,一个负责接收数据,一个负责发送数据
  >>>>>>>>>>>>>>>
  长短的区别是我要搞清楚,见现在看而言,长连接占用资源,但是一般通信性能肯定是好,短省资源。另外一个 很重要的区别就是,主动与被动,长连接是先主动建立一个连接,有数据就发送,没有就等,短连接则是如果有通信要求,被动的先建立一个连接,收发数据,断 开。具体的好坏个人觉得还是需要编程实践才知道。应该说对与server和client的影响还是很大。
  TCP/IP通信程序设计的丰富多样性 
  刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 
  序,据此一些人可能会认为TCP/IP编程很简单。其实不然, 
  TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 
  通信方式和报文格式的多样性上。 
  一。通信方式 
  主要有以下三大类: 
  (一)SERVER/CLIENT方式 
  1.一个Client方连接一个Server方,或称点对点(peer to peer): 
  2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 
  3.一个Client方连接多个Server方,这种方式很少见,主要 
  用于一个客户向多个服务器发送请求情况。 
  (二)连接方式 
  1.长连接 
  Client方与Server方先建立通讯连接,连接建立后不断开, 
  然后再进行报文发送和接收。这种方式下由于通讯连接一直 
  存在,可以用下面命令查看连接是否建立: 
  netstat  f inet|grep 端口号。 
  此种方式常用于点对点通讯。 
  2.短连接 
  Client方与Server每进行一次报文收发交易时才进行通讯连 
  接,交易完毕后立即断开连接。此种方式常用于一点对多点 
  通讯,比如多个Client连接一个Server. 
  (三)发送接收方式 
  1.异步 
  报文发送和接收是分开的,相互独立的,互不影响。这种方 
  式又分两种情况: 
  (1)异步双工:接收和发送在同一个程序中,有两个不同的 
  子进程分别负责发送和接收 
  (2)异步单工:接收和发送是用两个不同的程序来完成。 
  2.同步 
  报文发送和接收是同步进行,既报文发送后等待接收返回报文。 
  同步方式一般需要考虑超时问题,即报文发上去后不能无限等 
  待,需要设定超时时间,超过该时间发送方不再等待读返回报 
  文,直接通知超时返回。 
  实际通信方式是这三类通信方式的组合。比如一般书上提供的 
  TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的 
  组合是基本不用的,比较常用的有价值的组合是以下几种: 
  同步短连接Server/Client 
  同步长连接Server/Client 
  异步短连接Server/Client 
  异步长连接双工Server/Client 
  异步长连接单工Server/Client 
  其中异步长连接双工是最为复杂的一种通信方式,有时候经 
  常会出现在不同银行或不同城市之间的两套系统之间的通信。 
  比如金卡工程。由于这几种通信方式比较固定,所以可以预 
  先编制这几种通信方式的模板程序。 
  二.报文格式 
  通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 
  收和发送报文函数。 
  (一)阻塞与非阻塞方式 
  1.非阻塞方式 
  读函数不停地进行读动作,如果没有报文接收到,等待一段时间后 
  超时返回,这种情况一般需要指定超时时间。 
  2.阻塞方式 
  如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。 
  (二)循环读写方式 
  1.一次直接读写报文 
  在一次接收或发送报文动作中一次性不加分别地全部读取或全部 
  发送报文字节。 
  2.不指定长度循环读写 
  这一般发生在短连接进程中,受网络路由等限制,一次较长的报 
  文可能在网络传输过程中被分解成了好几个包。一次读取可能不 
  能全部读完一次报文,这就需要循环读报文,直到读完为止。 
  3.带长度报文头循环读写 
  这种情况一般是在长连接进程中,由于在长连接中没有条件能够 
  判断循环读写什么时候结束,所以必须要加长度报文头。读函数 
  先是读取报文头的长度,再根据这个长度去读报文.实际情况中, 
  报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须 
  转换成ASCII,常见的报文头码制有: 
  (1)n个字节的ASCII码 
  (2)n个字节的BCD码 
  (3)n个字节的网络整型码 
  以上是几种比较典型的读写报文方式,可以与通信方式模板一起 
  预先提供一些典型的API读写函数。当然在实际问题中,可能还 
  必须编写与对方报文格式配套的读写API. 
  在实际情况中,往往需要把我们自己的系统与别人的系统进行连接, 
  有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。
分享到:
评论

相关推荐

    Node.js连接OpenGauss异步转同步封装

    Node.js通过pg模块连接OpenGauss数据库,已封装为同步模块,可在异步代码中直接调用。

    C#TCP/IP同步和异步通信

    基于C#的TCP/IP同步以及异步通信实现方法,我已经把两种方法封装好了,直接调用就可以了,不仅可以实时获取连接的客户端,还可以实时刷新客户端连接,很好用的,如果有什么问题,欢迎联系我!

    mina 同步客户端,异步客户端

    本代码包含mina服务端,同步客户端-即短连接方式,异步客户端-即长连接方式。

    HttpAsyncClient 异步httpClient和同步httpClient连接池的工具类 包含jar

    HttpAsyncClient连接池的使用,项目中频繁发送http请求,同步http阻塞主线程,影响性能,使用 HttpAsyncClient可使性能提高,这里配合连接池使用,效果更好,同时还附带同步httpClient的连接池使用

    libcurl长连接高并发高性能封装测试分析源代码

    首先研究下长连接和短连接的性能区别。curl内部是通过socket去连接通讯。socket每次连接最为耗时,如果能够复用连接,长时间连接,减少每次socket连接的时间,则可以大大减少时间,提高效率。 (2) 多线程。单个...

    易语言同步异步套接字模块

    易语言同步异步套接字模块源码,同步异步套接字模块,Call,取字节集指针,异步客户_初始,异步客户_销毁,异步客户_连接,异步客户_断开,异步客户_发送数据,异步客户_取回数据,异步客户_回调函数,同步客户_初始,同步客户_...

    C#.net同步异步通讯

    C#.net同步异步SOCKET通讯和多线程总结。 Socket支持下的网上点对点的通信,服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能。服务器端建立一个socket设置好本机的ip和监听的端口...

    TCP异步同步机制

    自己封装的TCP通信的代码,调用相关函数连接并提供回调函数,当有网络数据会自动回调,就像Windows Message原理差不多~

    C#Socket同步和异步传输

    最近在研究Socket和异步 本例字中包含了 Socket异步传输小例子源码 实现了多个客户端连接一个客户端 并且对于字符串进行了一定处理 避免了服务端收到的信息混乱的现象 里面用了beginread() 异步回调

    C# TCP 同步 异步Socket类

    自己编写的C# TCP 同步 异步Socket类 同步类为纯socket结束收发类 无任何其他业务 异步类中我采用了事件回执的方式返回接收的数据及连接或通信状态(我没想到更好的方式 ) 有好建议的朋友记得联系我

    EMIF与异步存储器的连接框图

    小编介绍了DSP的EMIF接口与异步的SRAM和异步的FLASH的互联,方便用户去理解和学习。

    C++ boost::asio编程-同步TCP详解及实例代码

    boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...

    RPC-client异步收发核心细节

    异步回调和同步回调相比,除了序列化组件和连接池组件,会多出上下文管理器,超时管理器,下游收发队列,下游收发线程等组件,并且对调用方的调用习惯有影响(同步->回调)。异步回调能提高系统整体的吞吐量,具体...

    socket 异步源码

    这个是我花了好几天的时间,第一次接触socket,做了一个简单的登录,客户端发送登录名,然后服务器端判断是否存在用户,最后返回判断信息,采用异步的方式,vs2005代码可直接运行,注释不多,但是看方法名比较容易...

    [C#通信二]C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip...

    servlet tcp socket 异步转同步调用的两种解决办法

    1,这里的服务端到认证是TCP 异步的。 2,终端到服务端是HTTP同步的。 这里需要服务端接收到认证返回的数据结果过后,才能返回给终端。 附件代码是解决该问题的两种解决方案,可以用户同步的mina之类的socket...

    c++服务器的异步数据库操作

    通过异步线程类将数据库的异步操作从主线程中拆分开。 再使用std::function和std::bind实现回调,将数据库的同步操作改为异步操作

    HID USB通讯 异步读取数据(Windows API连接)

    开发一个不需要第三方类库即可完成的USB通讯案例项目,使用Windows API是为了正式的项目应用中客户免于安装第三方库或者使用其他特定类库文件导致的复杂问题。数据反馈和设备的移除都是通过事件触发接收。

Global site tag (gtag.js) - Google Analytics