长连接与短连接

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

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

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

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

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,可以说连接任何方式的通信程序都不存在问题。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

总之,长连接和短连接的选择要视情况而定。

 发送接收方式

1、异步 
报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况: 
(1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收 
(2)异步单工:接收和发送是用两个不同的程序来完成。 
2、同步 
报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

项目实例已存储硬盘。

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

 

贴个经典的

,

看完了就应该没啥问题了

 

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,

可以说

连接任何方式的通信程序都不存在问题。

原文地址:https://www.cnblogs.com/arctictern/p/6632701.html