有没有一些即时通讯的协议,像QQ,MSN这类软件的通讯方式说明,比如,客户端通过什么方式发信息至服务器端,服务器又是如何响应,客户端之间又是怎样互发信息 
我想做成客户端之间能互发信息,不通过服务器干预,但这样会有些问题:
1.客户端只有局域网的IP和端口,跨网络时之间不能互发信息
2.服务器不能发信息给客户端

解决方案 »

  1.   

    一般情况下,服务器只维护用户的状态。
    如果发信息方和收信息方都在线采用upd协议提高性能 ,如果收放不在线,先用tcp将信息发到服务器的消息队列,如果在消息队列中还没有被发送出去,估计要有个数据固定并索引的过程,然后服务器判断用户登录的时候,将发给该用户的消息用tcp发送得client
      

  2.   

    QQ登陆首先登陆到一台固定的服务器,然后由该服务器指定空闲服务器让你连接,将你下线后的信息发送给你,QQ用的是HTTP协议,视频的时候UDPMSN 是TCP/IP,保持对话状态,所以网络状况不好的时候经常会有断线的情况,不过通话比较有保障,不会象UDP那样有丢包的现象,缺点就是效率很低,聊天室就是用的TCP/IP,所以限定人数,不然带宽得不到保障发送信息容易,麻烦的是服务器端的客户状态,以及防火墙,代理等
      

  3.   

    QQ用的是HTTP协议
    不会吧?是TCP吧?
    不是全部采用TCP,在双方都上线的情况下,对于非会员,默认设置采用UDP,当然你可以设置自己采用tcp的
      

  4.   

    当用户不在线时,信息转发给服务器,由服务器存放数据库中,用户下次登陆时,可以通过服务器从数据库中查询到留言信息,这种情况暂时不讨论一般情况下,服务器只维护用户的状态。包括在线用户的IP和端口号(可能是局网IP,如何取公网IP,由用户登陆时发送给服务器),当如向在线用户发送信息时,如何把信息直接转发给在线用户,而不用服务器干预,因为已知道了在线用户的IP和端口(但可能是局网IP)
    上面的情况我在局网内测试正常;
    1.但在如果在不同网络内的两个用户发送信息时,会失败,因为如果用户通过代理服务器上网,没有公网IP,那么用户状态中的IP和端口只是网域网IP,这样在线用户之间是不能互发信息的
    2.同样,假设客户端和服务器端在不同网络内,服务器有公网IP,客户端通过代理服务器上网,客户端能正常发信息给服务器端,但服务器端却不能发信息给客户端
      

  5.   

    向qq这种IM软件,根本不可能采用数据库,否则同时在线那么多人,你处理过来么?不要什么都想到数据库,他们大部分数据都在系统内存中,实在放不下也是IO文件,根本不可能采用数据库的。
      

  6.   

    我的意思是指当向离线用户发信息时才采用数据库,
    在线用户互发信息时不用通过服务器,也就没用到数据库,直接p2p发送信息现在问题是p2p发信息时,当两个用户在不同网络内时,不能互发信息,因为两个用户都是通过服务器代理上网,自己没有公网IP,这才是我要请教的问题
      

  7.   

    最近看过一些资料,可以解决上面的难题,以下是原文引用:
     此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。
        总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了。