当前分类: 网络通信协议

php让服务器不返回chunked10/13/2011

chunked是http头部一个很特殊的东西,现代浏览器都支持解析Transfer-Encoding:chunked,chunked能更快的让页面呈现出来,因为它能分段下载,浏览器分段解析,对于大页面,这显然提高了可用性,facebook利用这个特性实现了牛逼的big pipe,那实在是将chunked发挥到淋漓尽致的应用了。

nginx好像默认就支持chunked,我还没有找到选项关闭,现在我想要获取一个服务器上的数据,该服务器头部默认包含了chunked,这个特性导致用php处理起来显得有些不爽,而且即使他分段提供,我还是需要把它全部读完才开始处理,虽然php可以很方便的http_chunked_decode,但我这人骨子里就是有点喜欢反人类,让服务器不要返回chunked的数据不就可以了吗?后来。。。。。后来还真让我想到了,chunked是http 1.1才有的东西,所以如果告诉服务器,我只能解析1.0,应该就解决问题了,请看烂代码示例:

让我膜拜一下全文吧 »

| 2条评论分类: 我爱PHP,网络通信协议 标签:  

关于飞信2011贺岁版通信协议二三事03/20/2011

到今天为止,飞信2011贺岁版是中国移动发布的最新的飞信pc版本,他的协议和2010区别很小,sip部分仍然是使用的v4版本,除了登录部分修改了一下版本号以及增加了一些与聊天无关的额外功能之外,就没有什么变化了。

我曾经有一个小需求:每天早上8点给自己发一条当天的天气预报短信,经过仔细查看,在下发现飞信客户端上有一个定时短信功能,并且在主界面上可以将天气发送给自己或者朋友,这颇令人振奋,一度以为问题就此解决!!但是再细细观察,发现官方客户端无法做到自动发送,于是只能用程序来实现这个东西了,long long time ago,那是飞信的2008版,本人有用php实现了一下飞信的短信功能,当时也是想弄个博客提醒功能,出于年久失修,那个老代码已经不能使用鸟!

太给力了,让我看完 »

| 2条评论分类: 咸吃萝卜,我爱PHP,网络通信协议 标签:  

推荐Charles(web debugging proxy)http调试工具10/17/2010

我在之前向大家推荐过Fiddler,一个非常强大http协议调试工具,但最近发现此工具又不适用了,我遇到的问题是这样子的:我想调试发布在facebook上的基于amf通信的flash应用,在我不开VPN的情况下,fiddler无能为力帮助我架设隧道并截获通信,而使用VPN以后,在fidder中仅能以直接查看RAW二进制数据的方式来查看amf通信(当然我试图找到fiddler的amf插件,未果),同学向我推荐Charles,我之前一直嫌它是java的,不太想用,而且原理和Fiddler一样,都是在浏览器和目标网站之间架设一个proxy来完成截获数据,都支持https,断点修改通信数据,甚至默认的监听端口都一样!!!所以刚开始我认为这是两个重复的产品,我已经有些习惯Fiddler了!后来,我才发现了他的更为强大之处! 此文妙哉,快快看全文 »

| 11条评论分类: 咸吃萝卜,网络通信协议 标签:  

360软件管家通信协议分析07/05/2010

曾经说过360利用云计算打压竞争对手的事情,今日一改往事之郁闷,我专门来篇文章夸奖下360安全卫士。咳咳!今天不完全是写360安全卫士的,我喜欢其中的一个叫做软件管家的功能,坦白说,我有点喜欢新软件,喜欢没事升级升级,尤其是chrome,一有新版本出来,我立马升级,好不含糊!国内这种软件管家很多的,不过我个人觉得360软件管家速度比较快。这点上,360的软件管家立功了,因为公司强制每台机器必须安装360,所以在公司,软件升级这很轻松,可是家里电脑我不想安装这玩意儿,于是我想,我只要弄到我想要升级的软件URL不就可以下载了么?基于这么一点朴素的想法,我就打算分析下360软件管家是通信协议是啥? 竟有如此美文,尽阅之 »

| 13条评论分类: 网络通信协议 标签:  

web socket 心跳包的实现方案05/30/2010

现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我们只是做一个简单的聊天室,但我们让他稳定可靠一些一点也没有错。

我的心跳包方案很是简单,原理就是间隔发送心跳包数据给服务器,服务器在一定时间内发回心跳包响应,对比超时限定,如果超过设定的超时时间,则认为当前与服务器的websocket连接已经断开,关闭当前web socket连接,善后处理,例如重新连接,或者弹出提示……

比较有用的核心代码是这样子的:

function keepalive( ws ){
	var time = new Date();
	if( last_health != -1 && ( time.getTime() - last_health > health_timeout ) ){
			//此时即可以认为连接断开,可设置重连或者关闭连接
			$("#keeplive_box").html( "服务器没有响应." ).css({"color":"red"});
			//ws.close();
	}
	else{
		$("#keeplive_box").html( "连接正常" ).css({"color":"green"});
		if( ws.bufferedAmount == 0 ){
			ws.send( '~H#C~' );
		}
	}
}

这就是心跳函数,发送心跳包和检测心跳健康度。我们将其植入到websocket的onopen事件中,来开启心跳检测。像这样:

var ws = new WebSocket( to_url );
  ws.onopen=function(){
		$("#statustxt").html("connected.");
		$("#send_btn").attr("disabled", false);
		heartbeat_timer = setInterval( function(){keepalive(ws)}, 1000 );
	}

是的,这样子就可以实现web socket的心跳包,这里有些类似于多线程的发送方式,在发送心跳包的同时,并不影响正常的数据通信,我们的例子还是以上次的websocket聊天室来改进,我们可以发现,心跳包运行过程中,并不会干扰到我们的正常聊天。服务端我也进行了一些修改,原理类似,在超过一定时间内都没有收到客户端发来的心跳包,则认为该客户端已经掉线,关闭连接,收回资源。

Demo在这里:https://www.zendstudio.net/libs/websocket/chat/demo2.html

现在,有一个新的问题出现,如果我们要用php socket来模拟心跳包技术,该怎么实现?各位路过的朋友请多指教,感恩戴德。

| 3条评论分类: web前端编程,互联网2.0,网络通信协议 标签:  

websocket 通信协议(已更新到version 13)05/11/2010

UPDATE:前些天有网友mail和我讨论websocket协议,当时颇忙!更惭愧的是,此篇文章竟已不能使用,原因是当时我写的还是websocket草稿时候的协议!终于,我将websocket 协议更新到了version 13版本 —–2012.5.19

websocket通信协议实现的是基于浏览器的原生socket,在客户端用JS即可轻松完成,前些天都在学习websocket 协议(但实际上websocket 协议甚为简约),并且粗略的思考过websocket的对于下一代web应用会产生怎样的影响,我想最大的巨变应该是就是实时性上吧!另外诸如上传大文件之类的优于http的应用。但问题也随之而来,服务端怎么办?前些天我弄了个websocket 聊天室的demo,现在还得在服务器上专门开个进程来跑呢,也许到时候不再是简单架设个web server就能跑应用的了。也许过不了多久,会出不同的服务端方案吧!先期待一下。

websocket的协议是很简单的,这里我把它分成客户端和服务端来讲。在客户端,new WebSocket即可实例化一个新的websocket对象,但其参数略微有一点不一样,参数格式是这样的ws://yourdomain:port/path ,这个从我的聊天室demo里面就可以轻松看出(ws = new WebSocket( “ws://www.zendstudio.net:9108/chat” ); ),WebSocket对象会自动解析这段字符串,发送到指定服务器端口,首先执行的是双方握手(handshake),客户端发送数据格式类似这样: 竟有如此美文,尽阅之 »

| 28条评论分类: web前端编程,互联网2.0,网络通信协议 标签:  

弄了个websocket 聊天室玩玩05/09/2010

今天,我写了个websocket的聊天室demo,实践之后感觉这个东西实现的长连接着实很有诱惑力,在数据量的传输上,除了第一次的handshake,其余的每次传输只在原数据头尾分别加上”\x00″和”\xFF”两个字符(除此之外,和socket便没有任何差别),这个和ajax的传输不太一样,后者属于http协议,因此每次都会带有的头信息。

websocket的协议颇为简单,在第一次handshake通过以后,便建立连接,其后的通讯数据都是以”\x00″开头,以”\xFF”结尾。在客户端,这个是透明的,websocket组件会自动将原始数据“掐头去尾”。

好吧!看看我写的简陋的demo吧(PS:请使用chrome 4.0以上版本来打开页面):
https://www.zendstudio.net/libs/websocket/chat/demo1.html

| 14条评论分类: web前端编程,互联网2.0,网络通信协议 标签:  

隆重献礼:http协议调试神器 – Fiddler02/06/2010

Fiddler真乃神器!它和市面上常见的很多web调试器、http调试器、sniffer都不同!它的原理是在浏览器(或者其他使用http协议的进程)和服务器之间做代理角色,这样所有的通信都要经过它!尽管sniffer和这个原理是一样的,但他们工作的网络层不同。

竟有如此美文,尽阅之 »

| 4条评论分类: web前端编程,网络通信协议 标签:  

php版fetion类源代码公开提供下载07/21/2009

首先声明:本人制作这个php版的飞信是基于飞信通信协议进行的黑盒研究,完全出于学习爱好研究之目的,谢绝用于商业用途!源码包含了我目前仍然免费提供的fetionserver.php,以及之前提供测试的a-client.php,压缩包中有vs_fetion(socket版).class.php和vs_fetion.class.php两个文件,视实际情况使用,协议是一样的,只是使用的php扩展不同,一般来说vs_fetion.class.php的兼容性更好一些。

OK,废话不多说,上菜!

下载php飞信源代码-vs_fetion

| 64条评论分类: 我爱PHP,有得下载哦,网络通信协议 标签:  

使用php获得可靠的精准的当前时间通过授时服务器05/28/2009

有一种情形是这样子的,比如机票业务中的订票流程,我们需要一个非常可靠的当前时间来支持,尽管大多数服务器的时间是非常准确的,我们使用time()来获取的时间是可靠的,但未免会有不确切的情况,也有的服务器由于未开启ntp(Network Time Protocol)来进行时间同步,再由于硬件环境等因素,导致时间五花八门,这在通常,也就差个几分钟、最多几个小时的情况是无可厚非的,因为在同一个网站使用的是同一个时间,可是有的时候这样很糟糕。在internet上,有免费专门提供UTC时间校正的授时服务器,使用NTP协议,这个可以参考前面的链接来获取更多知识。他提供的时间误差在20ms左右(不要说在数据传输过程中会耗费的时间不等,NTP早就考虑到了这一点),因此通过这种授时服务器,我们就能得非常可信的当前时间。

太给力了,让我看完 »

| 1条评论分类: 我爱PHP,网络通信协议 标签:  

PHP界大牛们
反人类不分昼夜
牛掰级朋友圈子