`
tl_oni
  • 浏览: 31207 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

长连接、短连接、同步异步、tcp/ip

    博客分类:
  • java
 
阅读更多

什么是长连接?

其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

通常的短连接操作步骤是:

连接-》数据传输-》关闭连接;

而长连接通常就是:

连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;


这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了


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


长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生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,可以说连接任何方式的通信程序都不存在问题

分享到:
评论

相关推荐

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

    本文将深入探讨如何在C#编程环境中实现TCP/IP的同步和异步通信,并结合提供的“WindowsInternetServer”压缩包文件,讲解如何封装这两种通信方式。 首先,TCP/IP同步通信是指在发送数据前,必须等待接收方确认接收...

    TCP/IP长连接和短连接

    在TCP/IP通信程序设计中,长连接和短连接是两种主要的连接方式,它们各自有其特点和适用场景。理解这两种连接方式对于开发者来说至关重要,因为它们直接影响到系统的效率、资源管理和安全性。 **长连接**是指客户端...

    C#服务器对多客服端TCP/IP多线程源码

    本示例中的"C#服务器对多客服端TCP/IP多线程源码"是一个典型的网络编程应用场景,它展示了如何使用C#语言设计一个能同时处理多个客户端连接的服务器。以下是关于这个主题的详细知识点: 1. **TCP/IP协议**:TCP...

    安卓版TCP/IP

    - 也可以使用Handler、Thread、ExecutorService等机制进行异步TCP/IP通信。 6. **权限设置**: - 在AndroidManifest.xml中,必须声明INTERNET权限,否则应用无法进行网络访问。 - `...

    java TCP/IP socket 编程(原书第2版)pdf+源码

    在Java中,TCP/IP Socket编程主要涉及应用层和传输层,特别是TCP协议,它提供了一种面向连接、可靠的数据传输服务。 在Java中,Socket类和ServerSocket类是TCP/IP通信的主要接口。ServerSocket用于创建服务器端的...

    TCP/IP详解卷1

    这部分内容可能涉及阻塞和非阻塞模式、同步和异步编程模型,以及多线程或多进程并发处理网络请求的策略。 此外,书中可能还会涉及错误处理、网络安全问题,如加密通信(SSL/TLS)、防止DDoS攻击等高级话题。通过...

    labwindows实现tcp/ip传输

    1. **创建TCP/IP连接**:使用LabWindows/CVI提供的库函数,如`tcp_open()`,来创建一个到指定IP地址和端口的连接。这涉及到设置服务器的IP地址和端口号,以及选择客户端还是服务器模式。 2. **数据传输**:连接建立...

    C# winfrom TCP/IP

    5. 接收和发送数据,使用Receive和Send方法,注意处理好异步通信和同步阻塞的问题。 创建TCP客户端: 1. 创建Socket实例,同服务器。 2. 连接到服务器,调用Connect方法,传入远程IPEndPoint。 3. 通过Socket实例...

    几个TCP/IP编程实例,WinSock编程,聊天实例

    WinSock编程是实现TCP/IP通信的一种方式,它为C++程序员提供了一组API函数,用于创建、连接、监听和管理套接字。在WinSock中,套接字是网络通信的端点,可以理解为数据传输的管道。创建套接字通常从`WSAStartup`函数...

    tcp/ip详解里sock小程序

    《TCP/IP详解》一书中,作者Richard Stevens引入了一个名为"sock"的小程序,它是一个用于实验和学习TCP/IP协议的实用工具。这个小程序是卷1的重要组成部分,旨在帮助读者更深入地理解网络编程中的概念和技术。sock ...

    TCP中长连接短连接

    本文将详细探讨TCP中的长连接和短连接,这两种连接方式在实际应用中的差异和选择。 长连接,也称为持久连接,指的是客户端(Client)与服务器端(Server)在完成连接建立后,保持连接状态不立即断开,以便于进行多...

    TCP/ IP协议与网络编程 实验报告

    通过实际编程,理解异步和同步I/O模型,以及阻塞和非阻塞模式的区别。 以上五个实验覆盖了TCP/IP协议栈的多个层面,从网络层的IP协议到传输层的TCP和UDP,再到应用层的HTTP协议,以及网络编程的基础——Socket。...

    C++ TCP/IP通讯简单代码

    需要注意的是,网络I/O操作通常是非阻塞的,因此需要处理好线程同步问题,或者使用异步模型。 例如,发送数据: ```cpp void CTCPClient::SendMessage(const CString& msg) { Send(msg.GetString(), msg....

    基于TCP/IP的网络通信技术实现了面向连接的用户与服务器间点对点

    本文将深入探讨基于TCP/IP的网络通信技术,以及如何实现面向连接的用户与服务器间的点对点异步通信。 TCP(Transmission Control Protocol)和IP(Internet Protocol)是TCP/IP协议族中的两个关键组件。TCP提供可靠...

    基于Windows的TCP/IP及UDP通信类库

    总结起来,这个“基于Windows的TCP/IP及UDP通信类库”提供了一种利用MFC和底层SOCKET接口实现同步通信的方法,适用于单线程的Windows应用程序。尽管不支持异步模式,但它为开发者提供了基础的网络通信功能,并且允许...

    Linux TCP/IP编程

    - **同步(Synchronous)/异步(Asynchronous)**: 同步操作会等待结果返回,异步则允许同时执行其他任务。 - **IP地址分类**: IPv4地址有A、B、C、D、E五类,IPv6则扩展到了128位。 在实际编程中,开发者需要理解...

    最好的TCP/IP编程

    《最好的TCP/IP编程》这本书是针对C#开发者深入学习TCP/IP和套接字编程的一本优秀教程。在当今网络通信领域,TCP/IP协议栈作为互联网的基础,其编程技术至关重要。C#作为.NET框架的主要编程语言,提供了丰富的网络...

    封装好的TCP/IP类

    1. **连接服务器**:`Connect()`函数,用于建立到指定服务器的TCP连接,通常需要提供服务器的IP地址和端口号。 2. **断开连接**:`Disconnect()`函数,用于关闭与服务器的连接。 3. **发送数据**:`Send(string ...

    TCP/IP通信c#例程

    在IT行业中,网络通信是至关重要的一个领域,TCP/IP(Transmission Control Protocol/Internet Protocol)协议栈则是互联网上最基础的通信标准。本示例“TCP/IP通信c#例程”旨在教你如何使用C#编程语言实现基于TCP/...

Global site tag (gtag.js) - Google Analytics