zoukankan      html  css  js  c++  java
  • 长连接与短连接

    什么是长连接,什么是短连接?

    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 端口号(如5678)。 此种方式常用于点对点通讯。 
    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,可以说连接任何方式的通信程序都不存在问题。

    问题:那么服务器是否支持长连接是根据服务器创建socket的时候参数选择的吗? 
    ---------------------------------------------------------------- 
    服务器处理完客户端请求,不断开连接,由客户端断,就是长连接,否则就是短连接,是程序行为决定,与创建socket无关。其实就是处理完数据是否调用了closesocket而已。

    长连接还是短连接首先是由服务端决定的,如果服务端支持长连接,则可以由客户端决定是长连接还是短连接。 
    没有现成的函数来创建一个长连接或者短连接,自己写的话也比较麻烦,因为必须把数据的发送和接收也一起绑定,比如短连接,客户端这个函数就必须实现连接-》发送-》等待数据接收完毕-》自动断开,服务端是接受连接-》接收数据-》等待数据处理完毕-》发送结果-》断开连接。

    什么是长连接和短连接? 
    所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发链路检测包以维持此连接。 
    短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对消息的发送。 
    我的socket是长连接还是短连接是由服务端决定的还是有客户端决定的?是否有一个函数来创建一个长连接或者短连接?(我的意思是有一个参数,表示长连接或者短连接     比如是否有类似的函数createLink(int   linkType)   调用的时候linkType为1表示长连接,为0表示短连接) 

  • 相关阅读:
    go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?
    ip地址获取无效,自己修改ip地址
    linux和windows双向互通的压缩包格式zip
    在notepad++中tab和空格的区别
    Django ----- app 和 ORM的操作和介绍
    Mysql --- 索引
    Mysql --创建用户和授权,备份
    Mysql --数据的增删改
    Mysql -- 外键的变种 三种关系
    Mysql -- 完整性约束
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3731736.html
Copyright © 2011-2022 走看看