最近想为写一个发送接收即时消息的功能(像QQ一样)。虽然现在关于IM的主题是比较热,但真正到开发上的资料又相对较少(也许小弟眼拙,没瞅见)。  
比较了网上的资料和我的想法,大致归纳出以下方案,希望各位同仁能讨论讨论,看看有什么比较好的解决方案。  
1.  使用MSN  Messager的API  
由于不是很清楚这个API的内部实现是怎么样的。同时它用的又是MSN的帐号。要装exchange等。麻烦的要死。不过也有可能对这个了解不深。如果有哪位高手知道,欢迎指教。  
2.  使用服务端消息分发,客户端端口侦听。  
这个方法效率和实现都很理想,可问题是只适合解决局域网内部使用。若是客户端通过共享代理的什么出来,那消息就分发不到。是个大问题。  
3.  使用MSMQ,对于消息队列的使用不甚了解。好象微软有个消息队列的组件。但好象需要部署一个消息队列服务器。客户端也要安装一个什么消息队列服务,整个使用和开发过程觉得比较复杂。目前还不甚明白,不知道消息队列是否适合当前的这个主题。  
4.  使用客户端轮巡服务器,可以轻松解决内外网等问题。可服务器和数据库的压力似乎大了点。  
 
附,当前系统架构:  
服务端采用SQL  Server数据库(可分布)。服务接口采用Web  service。开发平台VS.net,开发语言C#  
客户端采用桌面应用程序,开发平台不限,开发语言不限  

解决方案 »

  1.   

    我现在也在进行这方面的学习,正在研究LCS2005,期待高手
      

  2.   

    我选第4个:技术开发难度不大,易于实现
    internet上应用面广
    但是,要设计好数据库处理,数据库链接数要控制!
      

  3.   

    谢谢大家,向大家汇报一下最近的成果:
    首先参考了P2P的一些知识,发现可以用可穿越NAT的P2P来实现消息直发或通过服务器中转的消息发送。
    这是目前比较能接受的方法。
    实现也还简单。无非就是一些网络编程方面的知识。
    不过这样做对架构将会有一些影响。首先除了web服务外需要另外架设一台消息服务器。
    而消息服务器与客户机的通信是TCP协议,而不是像web服务一样用标准的XML/SOAP流。
    由于TCP协议是标准协议,因此也可以对客户端的开发语言不做限定。
    但因为上层协议会是自行指定的,因此可读性没有web service那么好。感谢winxieddd(一剑飘香(找工作)),但您用remoting个人认为并不是很适合原因如下,大家可以讨论讨论是不是这样:
    1. 破坏了SOA的结构:
    remoting要求两端都要是.net的程序吧。as i know,而且传输的内容相对XML/SOAP和自定逻辑协议的TCP来说可能更随意一些。因为对于两边的表现是直接获得了一个类。
    2. 是不是同样也存在穿越NAT和防火墙等共享上网的问题。感谢Tomgus(小桥流水),你的提议我开始也比较倾向。可是实在没有足够的数据或案例说明服务器能够承受这样的压力。若有300个客户端,每秒访问服务器一次检查是否有发给自己的信息。则服务器每秒将接受300次HTTP请求。查找300次数据库。删除假设10条被读取的信息好了。插入10条要发送的信息。再加上其他的业务,是不是有点超过sql server的承受范围啊?我原先做的一个项目平均每秒插入8条且海量查询的用的是oracle
      

  4.   

    在网上有个myicq的例子,你可以先看看,不过没注释,我弄了半天看不懂,我也对做IM工具感兴趣,咱们是否可以交流一下,我的QQ:54793651
      

  5.   

    经过这么长时间。该项目开发被搁置,但总结出了事件流供大家参考
    普通客户消息发送事件流
    1. A用户将需要发送的消息通过TCP通道发送到服务器
    2. 服务器判断消息目标,若是代理客户则走替换流“代理客户端接收消息”。
    3. 若是普通客户端,则发送消息该客户端信息属性中指定的IP和指定端口
    4. 若发送失败则将该消息存如离线消息待发表,并将消息目标从在线用户列表中注销,反馈A用户失败结果。
    5. 否则返回A用户成功结果代理客户接收消息事件流
    1. P用户webservice发送接收消息请求到服务器
    2. 服务器查找到该用户的消息缓存区,并将消息反馈给P用户。
    3. 服务器重写在线用户列表中P用户的最后存活时间代理客户消息发送事件流
    1. A用户将需要发送的消息通过webservice发送到服务器
    2. 走“普通客户消息发送事件流”第2步开始到结束服务器维持在线用户列表事件流
    1. 依次检查列表中每条用户信息。
    2. 若是普通客户则发送探测消息,若未得到反馈或异常,则将该用户从在线用户列表中注销。
    3. 若是代理客户,则检查最后存活时间,若远大于设定的接受消息请求发送间隔时间,则从在线用户列表中注销。
    4. 结束检查客户上线事件流
    1. 普通客户通过TCP通道发送上线信息到服务器。服务器将该客户信息注册到在线用户列表。
    2. 代理客户通过webservice发送上线信息到服务器。客户端通过webservice发送给服
    务器的数据服务器将转发到TCP通道