java 长连接的实现.txt32 因为爱心,流浪的人们才能重返家园;因为爱心,疲惫的灵魂才能活力如初。渴望爱心,如同星光渴望彼此辉映;渴望爱心,如同世纪之歌渴望永远被唱下去。梁应宏 引言 TCP 长连接服务在传统的智能网应用中扮演着重要的角色。由于其传输的高效率,在智能网SCP 和 IP 的各个模块之间,大量使用了这种服务。例如,SS7gateway 与 SCF、 SCF 与 INES、INES 与外部节点、CN 与 VN,等等。 相反,在各种WEB 应用中,广泛使用TCP 短连接服务。基于HTTP 承载的各种应用协议,如HTML, XML, SOAP 等,多数使用TCP 短连接服务。原因有二:一是这些HTTP 协议的数据包较大,传输所占的开销较大,连接建立的开销相对较小。此时使用长连接对性能的提升并不明显。二是相对于长连接而言,无论是对于客户端还是服务端,短连接的实现难度要低很多。 以网通水平业务平台SPGW 为例,多数对外接口采用HTTP/XML/SOAP 协议和短连接。然而,出于性能的考虑,还有两个接口采用TCP 长连接: l 东向接口(SPGW-DSMP): SCCP 协议使用二进制消息。 l 南向接口(SPGW-SMSC): SPGW 与短消息网关SMSC 之间的SM7 协议使用二进制消息。 从Java 开发语言的角度,短连接的使用比较简单。因为Java 的IO 库已经提供了一个httpConnection 类,成熟可靠,使用方便。但是,对于TCP 长连接的使用,Java 的 IO 库并没有直接的支持。本文将探讨对TCP 长连接服务的一般需求和我们的实现考虑。 以下也简称TCP 长连接服务为TCP 服务。 需求 具有网络编程经验的人都知道,TCP 程序的编写是“易学难精”。很容易编写一个TCP 程序,具有一定的功能并且在少数正常情况下可以运行。但是,要想让它在各种网络条件、各种负荷情况下都能稳定运行,却不是一件简单的工作。具体说来,TCP 长连接服务需要满足以下条件: 高性能 实现这一点的关键是,消息的接收操作必须是异步的。以 SPGW 与短信网关之间的消息流程为例,如下: 如上图所示,SPGW 可以不等待上一消息的应答消息,就发送下一个短消息。因此在同一个TCP connection 上,SM7 消息的接收必须是异步的,否则就会阻塞后续消息的发送。 健壮性 健壮性要求,TCP 长连接服务不仅要能适应良好的网络情况和低负荷,而且要能适应差的网络情况和高负荷。实现这一点需要做到: l 应用级心跳:自动检测网络故障。 l 应用级重连:自动排除网络故障。 l 请...