zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。

ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。Strive,游戏引擎。sky.zhuwei@163.com
posts - 196, comments - 1329, trackbacks - 101, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

基于Web的IM实现思考

Posted on 2006-05-09 16:58 zhuweisky 阅读(5531) 评论(30)  编辑 收藏 网摘 所属分类: 技术随笔

    如今绝大多数IM软件都是基于桌面的,通常使用Tcp/Udp,并且都实现了防火墙穿透(代理)和基于Udp的NAT穿透的P2P技术。创建一个基于Web的IM是否可行(我们这里不考虑在浏览器中嵌入类似ActiveX控件的伪B/S,因为它实际上还是一个C/S,我们要讨论的是纯的Web方式)?答案无疑是肯定的,但是有些限制,这是因为:
(1)基于Web的IM不可避免的采用Http作为主要的通信协议,而Htpp的非连接、无状态特性使得状态管理比较困难。当然,使用Http的好处是能轻易的穿过防火墙。(大多数网关都默认开放http的80端口)
(2)单向性。只有客户端(Web浏览器)主动去联系服务器,而服务端无法主动联系特定的客户。

    这些Web特性将会导致哪些限制了?
(1)客户与客户之间无法实现直接的P2P。因为基于Web时,一个客户无法直接“找到”另一个客户,就更别提NAT穿透了。
(2)客户与客户之间的消息交互是“伪实时”的,所有的消息都必须通过服务器进行“被动”地中转。比如,当客户A要把某个聊天消息Msg发送给B时,它首先将msg提交给服务器,因为服务器无法主动找到B,所以服务器需要暂存这个Msg(比如放入数据库),等到B来请求时,才能将这个Msg转发。这就是“被动”的含义了。

    即使有这么多限制,我们仍然可以实现一个像模像样的基于Web的IM,这只是需要一些简单的技术/技巧。
(1)客户端使用Ajax技术实现页面局部刷新。如果每当有新消息来临或状态通知来临时,都需要整个页面刷新,这个Web IM一定不及格。
(2)客户端使用定时器不断的询问服务器是否有新的通知。比如是否有别人发给我的Msg、某个好友的状态是否发生的变化等,如果有,则向服务器提取这些信息。
(3)文件传输功能,仍然可以实现,同文字聊天消息一样。发送方先将文件上载到服务器,接收方通过轮询发现有传送给自己的文件时,则下载文件。
(4)视频聊天功能,仍然可以实现。首先是视频的捕捉、编码、解码,这可能需要在浏览器中嵌入类似ActiveX的控件。其次是视频数据的传递,可以采用与文件传输类似的方式。无疑,这种方式是非常的丑陋。
(5)群功能。简单思考一下,会发现这个实现起来比较简单。

    尽管,通过种种技巧,我们可以实现一个基于Web的IM,但是它还能当之无愧的称为“即时通讯”吗?从前面的分析我们可以看到,所有的P2P通信都是“伪”即时的,并且如此实现的IM的服务端在用户量稍微大一点的时候的负载可想而知(特别是视频聊天功能,服务器需要暂存多大的数据量?)。
    所以,据我所认识的来推断,基于纯Web的IM现在还没有办法做成产品(你自己写个玩玩当然没问题)。当然,也许在我的认识之外可能有更好的解决方案,如果你知道这样的解决方案,请一定要留言告诉我。
    我想,有一点是真的,那就是B/S永远也无法吞并C/S的所有领地,有很多应用一定还是非C/S不可的。


 

Feedback

#1楼    回复  引用  查看    

2006-05-09 17:10 by neoragex2002      
想把一切都搬上web本身便是一种机械性的思维定势。对IM而言,很多技术外的东西更加重要一点。而且End to End与Peer to Peer也是有区别的...

#2楼    回复  引用  查看    

2006-05-09 17:36 by zitiger      
个人觉得这样更像一个聊天室了

#3楼    回复  引用  查看    

2006-05-09 17:40 by Allen Zhang      
msn messenger 不是有web版了嘛。。

#4楼    回复  引用  查看    

2006-05-09 19:07 by edison1024      
没什么用嘛,早几年以前不是有个很流行的"热狗"什么的啊,现在不都匿迹了

#5楼    回复  引用  查看    

2006-05-09 20:12 by 补丁      
不是很清楚怎么实现的,但是gmail里的googletalk似乎是实时的...有谁知道的可否告知一下

#6楼    回复  引用    

2006-05-09 20:55 by 我是阿呆 [未注册用户]
已经见过不少了,例如ebay.com.cn得客服。还有一些公司在线客服
b/s版有个很大得优势,就是不要另外安装软件
公司产品中也有这一块功能,正如楼主所说,用得是Ajax技术
客户用得不多,算是个噱头而已。

# re: 基于Web的IM实现思考 回复
2006-05-09 20:12 by 补丁
不是很清楚怎么实现的,但是gmail里的googletalk似乎是实时的...有谁知道的可否告知一下
很久以前装过个googletalk,似乎是c/s的?

#7楼    回复  引用    

2006-05-09 21:42 by 我要高飞 [未注册用户]
http://webmessenger.msn.com/
msn就有Web版的啊

#8楼    回复  引用  查看    

2006-05-09 22:10 by 马维峰      
Google Gmail下的Gtalk的Web版本就不错。
可以把语言更改为英文试试看。

另外Mop、Donews新推出的SNS的IM也是web的,效果也不错。

#9楼    回复  引用  查看    

2006-05-09 22:39 by 黄象贵      
花了一个月,做好了的。
俺的毕业设计。

#10楼    回复  引用    

2006-05-09 22:56 by 夏林 [未注册用户]
客户用得不多,算是个噱头而已。

#11楼    回复  引用  查看    

2006-05-10 02:03 by Smeagol      
GTalk web 版的狠不错,也很实用.

#12楼    回复  引用    

2006-05-10 09:10 by yaozy [未注册用户]
用异步调用代替轮询

#13楼    回复  引用    

2006-05-10 09:16 by wraithkings [未注册用户]
http://www.meebo.com
一个很不错的基于Web的IM实现

#14楼    回复  引用    

2006-05-10 13:46 by 飞毛腿 [未注册用户]
类似的产品已不少了, 我有im,后来也做出一套简单的网页会话的东西,可以看看

http://210.192.125.73:8080/talktouser.htm

#15楼    回复  引用  查看    

2006-05-10 15:32 by Konimeter      
以前也想弄一个web IM
后来觉得弄个这样的IM,还不如弄个兼容IM,
MyIM就是一个好产品,好东西,不会让人介意在机器上安装东西的。。。

#16楼    回复  引用  查看    

2006-05-11 00:23 by 双鱼座      
>> 我想,有一点是真的,那就是B/S永远也无法吞并C/S的所有领地,有很多应用一定还是非C/S不可的

不同意你的说法。由于B/S在安全方面的特别限制,B/S甚至无法吞并C/S十分之一以上的领地。

#17楼    回复  引用  查看    

2006-05-11 17:20 by Beginor      
老兄,CuteSoft的就有一个很不错的Web Messenger啊。
http://www.cutesoft.net/Web-Messenger/default.aspx

#18楼    回复  引用  查看    

2006-05-11 17:31 by 丁丁      
你说的就是这个产品吧?
http://www.coffeecup.com/live-chat/
零售版下载:
http://www16.fixdown.com/en/2db758242a0ae4f3.asp

#19楼    回复  引用  查看    

2006-05-12 09:37 by smalldust      
我也在考虑一个web IM相关的项目,希望对这方面有兴趣的朋友参与讨论!
我的MSN是smalldust[at]hotmail.co.jp

#20楼    回复  引用  查看    

2006-05-12 14:50 by 补丁      
@yaozy
试试它的响应速度,我觉得不是异步调用
我与同学聊天时用最快的速度打1 回车, 2, 回车,3 ,回车......同学的googletalk几乎是实时收到的,而且没有出现123同时出现的这种情况...
不理解怎么做到的
哪位帮忙解释一下~~

#21楼    回复  引用    

2006-05-14 09:54 by 飞毛腿 [未注册用户]
通过网页发送到客户端,是实时的消息,主要是客户端到网页的消息,可能有异步调用的问题;不过这也是可以实现实时,方法是服务器总保持一个和网页的tcp连接,发送的内容很大, 这样网页这边总在接收中,客户端发送的内容就能实时显示在通讯记录.

#22楼    回复  引用    

2006-08-24 22:26 by leoxu [未注册用户]
哈哈....看来有很多朋友在想这个了.
我也感兴趣,,有空到我的BLOG聊聊.

我认为B/S的潜力大, 你说到服务器的原因,我想随着硬件的快速发展, 网速,服务器质量都不成问题.

#23楼    回复  引用    

2006-10-19 09:26 by info.Eilien[#]hotmail.com [未注册用户]
http://210.192.125.73:8080/talktouser.htm
: 基于Web的IM实现思考 回复
2006-05-14 09:54 by 飞毛腿
通过网页发送到客户端,是实时的消息,主要是客户端到网页的消息,可能有异步调用的问题;不过这也是可以实现实时,方法是服务器总保持一个和网页的tcp连接,发送的内容很大, 这样网页这边总在接收中,客户端发送的内容就能实时显示在通讯记录.

网页的tcp连接,发送的内容很大, 这样网页这边总在接收中, GWT应该不会这样做吧。那不是服务器的负载大得要命。?

#24楼    回复  引用    

2007-12-29 10:52 by rhythm.mail@gmail.com [未注册用户]
Gtalk目前的web版本是基于flash的,底层应该不是直接的走http,估计是使用flash以传统客户端的方式开tcp socket,通过与google的某个以80或443为服务端口的XMPP connection manager保持长连接的方式来进行通信。所以在响应度方面可以与传统客户端媲美,同时又可以保持http的防火墙穿透性的特征。猜的……

#25楼    回复  引用    

2008-01-14 16:55 by efoxy_me [未注册用户]
其实gtalk的web实现是用到一种叫comet的技术,说是技术,其实和ajax差不多,也是把现有技术回炉再利用,只不过实现的比较巧妙而已,有兴趣的可以看看这里:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

#26楼    回复  引用    

2008-04-20 10:49 by 枯の灵 [未注册用户]
谢谢楼上的兄弟

同时

这篇文章让我思考很多

谢谢分享咯

#27楼    回复  引用    

2008-05-13 01:07 by 邢锐平 [未注册用户]
其实还是可以实现的。。

就是用flash做客户端。。flash可以通过socket和服务器端联系。。

#28楼    回复  引用    

2008-05-24 22:41 by tww [未注册用户]
我刚传了ASP写的漫漫webim(即时通讯)平台代码了,在我发布的资源里
漫漫 WEB IM (即时通讯) 平台

该程序开始写于2006年,现对其进一步修改完善,由于使用ajax,使得即时通讯功能能很好的实现

更新
2007-7-14 显示在线人数和好友使用ajax
2007-7-15 修改查看好友时分页BUG,对界面进行了微调,刷新主页面会使自己离线,控制好友人数上限,修改每页显示好友数量,以弥补显示时的BUG,有待以后重写显示好友的程序。
2007-7-17 加入消息声音
2007-7-19 注册随机生成漫漫号码,将页面中cint函数改成clng函数避免号码超过cint范围出错,漫漫登陆使用ajax,漫漫密码MD5加密
2007-7-20 修改好友显示页面,使通常头像连接到发消息页,而不是原来显示状态提示。隐身或离线好友发给你的消息能显示
2007-9-7 对文章小区模块修改,加入隐藏文章功能,隐藏的文章只有管理员可见
2007-10-7 更改漫漫图标
2007-10-9 修改webqq表,增加等级算法字段及相关字段,
增加漫漫等级代码,参照QQ等级算法,完善
修改分钟计算代码BUG,修改刷新时间bug,
修改剩余活跃天计算bug,修改当前活跃天计算bug等
继续完善等级算法,修改算法漏洞
2007-11-20 修改漫漫等级为0时,剩余升级天不变等bug
2008-3-26 仿照QQ奥运火炬传递编写奥运火炬模块,修正传递火炬显示错误,增加传递火炬的图标
2008-3-29 增加漫漫游戏冷月寒枪(原创框架)
2008-4-1 修改在线时间等计算方法为实时累计
2008-4-5 增加漫漫黑名单操作
2008-4-6 主界面顶部实现ajax,修改从第1天进入第2天时间计算bug
2008-5-22 修正管理退出后发表文章不刷新bug,修改发表文章后管理后台不显示bug
路漫漫其修远兮,吾将上下而求索!希望漫漫不断成长,

其中module文件夹为模块文件夹,现制作三个模块:
原创的冷月寒枪webrpg游戏程序(不完善),仿照腾讯QQ2008奥运圣火传递程序, 文章小区程序

漫漫号码10000密码1,文章小区后台管理帐号admin密码1

我的WEB群:4531488
别人的QQ群
ASP群:15718724
南京银茂铅锌矿业有限群:16309353
正版烧饼群:44093408
.NET部落群:3978218
ASP.NET(VB)学习研究群:14186530
ASP风火轮②群:16067282
ASP讨论群:13683242
BICQ交流群①:2014986
Blog技术交流群:10262665
DOS BIOS 注册表群:36508706
LanMsg4群:49111815
PPLIVE魔兽直播频道群:9913523
Visual Basic2005群:5303625
WC3群:12215760
Web信息技术群:3322548
web开发群:4635188
冰峰帝国群:37495097
第二舰队群:51308536
绝对草根群:17975491
绿色CSS 联盟群:49326944
马朝阳群:6013975
魔兽爱好者群:34273557
软件技术开发群:38071946
手机大玩家群:12913379
腾讯Web加速器测试2群:20520024
网站开发[web2.0标准]群:56723284
我爱数科院13班群:4035788
GOD-angle站队群:54437350
修改于2008-5-24 22:24
tww qq:43637507

#29楼    回复  引用    

2008-06-02 23:17 by Wills.Deng [未注册用户]
怎么感觉说的这些问题在我的IM中很多都不存在? 我可没说大话,看看我的Blog就知道了.
1. 真正socket.
2. 真正主动推送.

#30楼    回复  引用    

2008-11-01 00:23 by 男生贞子 [未注册用户]
基于Flash来做,可以在网页中开Socket的,基于Ajax做Http效率太低,Flash做WebIM是王道啊,而且我相信没有人会质疑Flash的普及程度吧,AS3新加入了二进制的Socket不过原来我知道的,从Flash6开始Flash就支持Socket了,只不过那时候Flash还只支持文本的Socket传输,并且基于Flash来做,服务器和客户端可以在不同域下,Flash还可以实现跨域发送数据,做网页前端还是Flash是王道啊




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: