1概念
Socket:socket实际上是对TCP/IP进行的封装,我们可以使用socket套接字通过socket来传输。首先我们需要明白的一个概念就是通道,简单地说通道就是两个对端可以随时传输数据的信道。我么常说的所谓建立socket连接,也就是建立了客户端与服务器端的通道。
长短连接:显而易见,长连接也就是这个socket连接一直保持连接,也就是通道一直保持通畅,两个对端可以随时发送和接收数据;短连接就是我们发送一次或有限的几次,socket通道就被关闭了。首先,我们必须明白的是socket连接后,如果没有任何一方关闭,这个通道是一直保持着的,换句话说,如果任何一方都不关闭连接,这个socket连接就是长连接,因此Java中的socket本身就是支持长连接的(如一个简单的实验:服务器端不关闭连接,服务器端每隔10秒发送一次数据,服务器端每次都能正确接受数据,这个实验就可以证明)。
那么既然socket本身是支持长连接的,那么为什么我们还要提短连接的概念呢?试想一个中国移动的短信网关(即通过发布socket通信接口)每时每分都有N多个连接发送短信请求,加入服务器不加任何限制地直接和客户端使用长连接那么可想而知服务器需要承受多么大的压力。所以一般的socket服务器端都是会设定超时时间的,也就是timeout,如果超过timeout服务器没有接收到任何数据,那么该服务器就会关闭该连接,从而使得服务器资源得到有效地使用。
2 如何实现长短连接
在1中我们已经介绍了长短连接的概念,服务器如果超过timeout时间接收不到客户端的通信就会断开连接,那么假如客户端在timeout时间前一秒(或者更短的时间)发送一条激活数据来使服务器端重新计时,如此重复就能保证服务器一直不能进入timeout时间,从而一直保持连接,这就是长连接的实现原理。下面我们通过一张图说明:
由上图可见,是否是长连接完全取决于客户端是否会在timeout时间发送心跳消息,因此长短连接是和客户端相关的,服务器端没有任何区别(只不过服务器端需要设定timeout而已)。
代码实现可参照:
http://download.csdn.net/detail/feichenwangyalin/7951457