QQ等程序聊天,双方是否使用SOCKET通信?应该不会都是通过服务器吧,那样服务器负担得多大啊?
如果是SOCKET,那么多的好友,一下子得建立多少个啊?还得考虑上线下线隐身等乱七八糟的问题。
请高手帮忙指点一下这种复杂程序的结构,谢谢。

解决方案 »

  1.   

    应该是SOCKET通信啊,那个服务器是N台的,
    我们现在的项目也是用socket的,
    测出socket平均每秒能有2000多个并发连接,
    这就可以了,2000个并发已经很高了
      

  2.   

    如果要在Java中用TCP/IP协议的话,要用socket了,我做过类似的项目,但是客户端的量不是很大,不会达到几十万的程度,感觉还可以啊,要不行的话用几个服务器也可以的
      

  3.   

    那请问,是不是正常情况下只是QQ跟服务器的连接,先发送消息的一方将消息发给服务器,
    如果对方在线就建立SOCKET,如果不在线就储存在服务器里。
    一定时间内如果没有通信,则断开SOCKET。客户端定期发消息给服务器证明自己在线。
    然后服务器发现客户端下线,发送给其好友下线消息,或者其他方式。
    这个就差不多了?
      

  4.   

    这样的, 你和我聊天,你和我有一个socket(有超时限制)  你和服务器有一个socket(但这个不用于传输数据,只是检测你的状态)
      

  5.   

    QQ使用的是UDP来传输消息的。
    Socket应该是针对TCP协议的。楼主,如果想编写一个通信程序,可以使用UDP,也可以使用TCP。我觉得,使用UDP协议比较好,但是,要确保信息包的丢失重传。
    用户的在线状态,可以使用服务端轮询检测+客户端周期性报告的方式,进行状态同步。无论使用哪种协议传输数据,最好都要在传输协议上再封装一层协议。
    这样便于管理。
      

  6.   

        我还是很有发言权的呀,我毕业设计就是写的这个(不过当时用的是vc写的,带文件传输的)
    我来说下我的思路吧:
       1.如何知道谁在线?
          Server维护一个list就ok了(存所有人的ip,名字,在线等)
       2.如何让服务器随时能找到你?
       前提:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。
       3.如何跨内网直连
       Nat打洞(难):
       我简单说下原理,有两个客户端A,B ,当然必须有Server啦(他可以随时连接A,B)
       当A想连B时,A就回从Server那要B的ip,然后与B建立连接(第一次不能成功的,因为看红字)。
       这时A告诉Server,我找不到B,你替我告诉他一声,我想与它连接,服务器就告诉B,你给A下一个请帖(B发请求向A)! 
       这时A再向B发起连接就可以成功了(以后就不用server帮忙了)。
       4.如何保证数据的可靠性(难)
       滑动窗口协议,这个一句话两句说不清楚啦,自己google下。
       5是否在线。
         我的设计是每隔40秒客户端把Server中存自己的信息中的在线改为真,而服务器每过45秒就检查这个在线变量是否为真,真的话把他改成假,如果假的话就说明这个人在45秒没有向Server报到=>他网络出现异常了,掉线了,向其它人发这个人的掉线通知。(这么设计原因在于当用户网断了没有发下线通知,我们也能知道他不在线了)
       6文件传输(难)
       把文件读到buf里,然后每次发1024b(当收到接收方确认后再发下一个1024b)。呵呵 ,有问题在交流,以上有些概念可能说的不对,呵呵
       
      

  7.   

        我还是很有发言权的呀,我毕业设计就是写的这个(不过当时用的是vc写的,带文件传输的)
    我来说下我的思路吧:
       1.如何知道谁在线?
          Server维护一个list就ok了(存所有人的ip,名字,在线等)
       2.如何让服务器随时能找到你?
       前提:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。
       3.如何跨内网直连
       Nat打洞(难):
       我简单说下原理,有两个客户端A,B ,当然必须有Server啦(他可以随时连接A,B)
       当A想连B时,A就回从Server那要B的ip,然后与B建立连接(第一次不能成功的,因为看红字)。
       这时A告诉Server,我找不到B,你替我告诉他一声,我想与它连接,服务器就告诉B,你给A下一个请帖(B发请求向A)! 
       这时A再向B发起连接就可以成功了(以后就不用server帮忙了)。
       4.如何保证数据的可靠性(难)
       滑动窗口协议,这个一句话两句说不清楚啦,自己google下。
       5是否在线。
         我的设计是每隔40秒客户端把Server中存自己的信息中的在线改为真,而服务器每过45秒就检查这个在线变量是否为真,真的话把他改成假,如果假的话就说明这个人在45秒没有向Server报到=>他网络出现异常了,掉线了,向其它人发这个人的掉线通知。(这么设计原因在于当用户网断了没有发下线通知,我们也能知道他不在线了)
       6文件传输(难)
       把文件读到buf里,然后每次发1024b(当收到接收方确认后再发下一个1024b)。有问题在交流,以上有些概念可能说的不对,呵呵 
       
      

  8.   

    红颜色的内容,意思理解得不是很明白。备注一点:通过持有客户端的Socket,服务端是可以主动向客户端发送信息的。