如果采用的是C/S模式的,并且提供用户注册功能,我认为流程大致如下:
首先,服务器端:侦听客户端的连接请求,并利用不同的代号区分连接的类型,如01代表注册用户,02代表用户上线,03发言,04下线等等,至于判断用户是否在线可以再服务器端的数据库中设置一个字段来保存,用户上线,update其值为1,用户下线,update其值为0.
其次就是客户端,客户端连接上服务器之后,发送信息,但是头部要利用01、02、03、04等类型区分开来。(如果想准确的检测用户的在线状态,可以每隔1分钟,对服务器端进行一次连接,确认还在线),那么就可以实现一般功能。问题是,现在我想让A用户和B用户进行聊天,到底该利用哪种协议呢?
能不能不通过服务器进行(目的是减轻服务器的负担)。听说腾讯的QQ在登陆服务器的时候利用的是TCP连接,真正的两个人聊天的时候利用的是udp,这是怎么回事?
这方面小弟不是太精通,还请懂这方面的给个解释,谢过了先。

解决方案 »

  1.   

    首先你 对 传输协议 应该有个大概的了解.. 他设计到的有 udp 和 p2p 核心就在这里面了.. 呵呵.. 如果要做的话, 你应该专研 这两个东西... 
      期于的东西 都是一些数据库的东西了.. 用C#做开发的话很简单..socket类里面封装了挺多不好理解的方法.
      所以你研究研究差不多少就能弄出来的.
      

  2.   

    以前有人在csdn论坛上发了个QQ,C++做的,还用了什么打孔,当时没怎么看明白,主要问题还是他们之间的通信问题~~
      

  3.   

    哪种协议呢? 
    消息传送用udp,端口是4000(发送)8000(接收),其他功能不知道用什么 
    呵呵 肤浅 请先鄙视后给分!
      

  4.   

    参考
    QQ是怎么通信的? 
    http://user.qzone.qq.com/398158328/infocenter?ptlang=2052http://www.cnblogs.com/hjf1223/archive/2008/03/11/1101017.html
      

  5.   

    QQ是怎么通信的? 
    http://user.qzone.qq.com/398158328/infocenter?ptlang=2052
    http://www.cnblogs.com/hjf1223/archive/2008/03/11/1101017.html
      

  6.   

    要是两个登陆到服务器的客服通信   简易 存储在转发    发送信息前  加个标志位类似 01,02,03  这样的 然后服务器在受到这样的信息  查找登陆到要转发的套接字实例  然后 转发给该客服   服务器 把登陆的客服 的套接字实例都存储起来 以便 转发至于 用udp 还是tcp 这个tcp 就能搞定
      

  7.   

    我记得下载里面好像有C#写的类似QQ代码,可以参考一下
      

  8.   

    我这里有个myqq的源码,但是看上去晦涩难懂啊,源码看了下,倒是没看出思路,不过12楼的想法很好,
    即客户端一上线的时候,就直接把自己的ip和端口发给服务器,服务器再转发给所有线上的用户,那么用户交流就可以直接通过udp了,不用通过服务器的转发了。
      

  9.   

    12楼的想法还是有问题的。这时你会有端口复用的问题。一个端口又用来发送消息,又用来接受消息,视频,文件。这时可能会导致客户端反应慢。建议用TCP来保持连接。保证基本文字通讯。用UDP来实现P2P通讯。
      

  10.   

    先暂时不考虑tcp的问题,因为腾讯的qq用的就是udp传输方式,那么,如果客户端上线发送自己的套接字给服务器,服务器再转发给各个客户机,然后两个客户机就可以通过套接字通讯而不用通过服务器传输了。问题就来了
    假设两个客户机在内网,内网的套接字都为  192.168.0.23:10011  (这种套接字是可能存在的)
    那么这两个客户机如何通过udp通讯?
      

  11.   

    这样就要用到NAT穿透了。这时又涉及到非对称与对称穿透的问题了 。很麻烦。
      

  12.   

    楼上说的是NAT穿透,是不是和UDP打洞是一个概念,但是像浩方,像QQ游戏,在查看ip的时候,用的都是一个a类的ip地址,
    他们这是不是把只要在线的用户都加入到一个A类的虚拟局域网中间去,是这个技术吗?
    如果是的,那么是如何实现的,如果不是,像nat穿透技术又是如何实现的?
      

  13.   

    那要看你选得的c/s 还是b/s