长连接

什么是“长连接”和“短连接”?

解释1

所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,   
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接

解释2

长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。   
而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。

解释3

长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。   
通信方式   
  各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需 要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。   
  现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。

解释4

短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。   
  长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lee576/archive/2008/11/07/3245167.aspx 
==========================================
http://www.zeevin.cn/?p=126 
php的长连接是实现php即时通信的一个不错的选择,下面的代码在firefox中可以显示出效果,在IE中还要改进。
<?php
set_time_limit(0);
header(”Connection: Keep-Alive”);
header(”Proxy-Connection: Keep-Alive”);
for($i=0; $i<1000; $i++) {
   print ‘fuck man!’.$i.’<br>’;
   flush();
   sleep(3);
   clearstatcache();
}
?>

======================================
Content-type:multipart/x-mixed-replace;boundary=ThisRandomString
这样一个头 

======================================
ajax篇,WEB 长连接 
大家都知道WEB是片段型代码.那么不能服务端控制客户段.
那么我们将这项技术进行研究吧.
web服务器通知客户端.
方案1.不断刷新页面.获得是否进行更新.但由于WEB是片段型代码.不能进行长连接
优点:即使跟新.
缺点:整体刷新会产生闪烁.异步刷新.服务器产生大量数据.
方案2.整体代码开始.首先进行一次AJAX长连接.
优点:可以更好的产生操作.
缺点产生难度比较大
-------------------------------------------------------------------------
HTTP/1.1 200 OK
Date: Sun, 21 Sep 2008 04:53:45 GMT
Server: Apache/2.2.3 (Debian) PHP/5.2.6-0.dotdeb.1 with Suhosin-Patch
X-Powered-By: PHP/5.2.6-0.dotdeb.1
Content-Length: 179
Keep-Alive: timeout=15, max=90
Connection: Keep-Alive
Content-Type: text/html;charset=utf-8
-------------------------------------------------------------------------
首先抓个包看下HTTP协议
然后自己写WEBSERVER
并且每次发送套接字.要头部必须得用上面的片段协议代码
javascript ajax 只能对HTTP进行处理。
那么自己写个套接字程序.就基本可以实现需要的功能
javascript 
片段代码
--------------------------------------------------------------
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0");//ie下的创建方式
function OpenService()
{
xmlhttp.open("POST","http://127.0.0.1:5550",true); //建立异步通信     xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
    var m=xmlhttp.send("标示号");
}
捕获onreadystatechange事件每次进行再次循环
setTimeout(OpenService(),100);

这样实际上已经可以进行长连接了
但这么做套接字.那得用标示号来区别.
WEBSERVER进行循环接收.
然后再查询数据
如果有数据发送HTTP协议,然后再把套接字发过去
js判断是否更新
如果更新 那么直接 EVAL();或者其他方案。
最近正在写WEBSERVER个人处理数据的软件。挺忙。对不起大家了
.下次带给大家的是JS挂马.
和其他的不同的地方是
反弹式的挂马.嘿嘿.一般管理员查不出来
因为属于安全代码.
就说到着.下次继续
======================================

======================================


这种方式实际上是长连接的最简单实现。和cgi很类似。

PHP实现:
主要是想演示一下几点:
set_time_limit(0);
这个用来保证长连接不会因为php请求超时而中断
   ob_flush();
   flush(); // used to send the echoed data to the client
这两句共同保证php会即时清空 缓冲并输出
等效于perl中的$|=1
sleep(1);
延时1s.这个太重要了。
用于循环时释放cp
javascript和VB 都没有这个功能。
相关源码:
<?php

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 2008 05:00:00 GMT");
flush();

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Comet php backend</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>


<?php
set_time_limit(0);
while(1) {
  echo ''<span>''.time().''<BR></span>'';
  ob_flush();
  flush(); // used to send the echoed data to the client
  sleep(1); // a little break to unload the server CPU
}

?>
</body>
</html>



另外的一篇参考:

什么是长连接,如果你没听说过,可以往下看!

   长连接到底有什么用?我想你应该见过很多在线聊天工具吧,比如新浪的Woocall,另外还有很多网页在线聊天的工具Omegle也是一个很不错的网站,前段时间挺火的,目前alexa全球排名8694(2009-8-18数据),另外使用校内的人应该会熟悉其中一个功能,如果有人回复你了,网站会马上出现提示,此时你并没有刷新页面;Gmail也有此功能,如果邮箱里收到了新的邮件,网站会马上提醒你,即使你的网页一直未刷新过。
  
   这么多类似的功能都离不开长连接,短连接一般都是单项请求数据,服务器不能主动把数据“推”想客户端,但有了长连接就好多了,利用后端与前端的技术组合起来,可以实现服务器的“推送信息”功能,如果数据库里面有更新,后端程序可以立即把数据“推送出来”,而不要多次反复请求,多次建立连接,多次断开。

php实现长连接示例:

 程序代码<?php
echo "每隔3秒输出一次<br />";
set_time_limit(0); //保证php程序运行不超时退出
while(1) {
   echo date("H:i:s")."<br />";
   ob_flush();
   flush(); //刷新并输出PHP缓冲数据
   sleep(3); //延迟3秒
}
?>



示例代码2:

 程序代码

set_time_limit(0);
header("Connection:Keep-Alive");
header("Proxy-Connection:Keep-Alive");
for($i=0;$i<60;$i++) {
   print 'text'.$i.'<br>';
   ob_flush();
   flush();
   sleep(1);
   clearstatcache();
}

什么是短连接、长连接、Socket基础知识字体大小:  socket

Socket协议的形象描述
  socket的英文原义是“孔”或“插座”。在这里作为4BDS UNIX的进程通信机制,取后一种意思。socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接。

详细内容见 百科


通常短连接是这样:连接->传输数据->关闭连接
那什么是长连接?一般长连接相对短连接而言的,长连接在传输完数后不关闭连接,而不断的发送包保持连接等待处理下一个数据包。
such as: 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。

那什么时候用短连接呢?
一般长连接用于少数client-end   to server-end的频繁的通信,例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。( 查看来源 )


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个字节的网络整型码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值