日期:2014-05-20  浏览次数:20629 次

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

------解决方案--------------------
是通过服务器建立的连接,但连接以后就是聊天双方的关系了,定时的向服务器发送一个消息,服务器判断是否在线,这就是为什么有的时候你的QQ下线了,对方仍然显示你在线,这种模式也叫混合模式,编程也不是很难实现
------解决方案--------------------
QQ使用的是UDP来传输消息的。
Socket应该是针对TCP协议的。

楼主,如果想编写一个通信程序,可以使用UDP,也可以使用TCP。

我觉得,使用UDP协议比较好,但是,要确保信息包的丢失重传。
用户的在线状态,可以使用服务端轮询检测+客户端周期性报告的方式,进行状态同步。

无论使用哪种协议传输数据,最好都要在传输协议上再封装一层协议。
这样便于管理。

------解决方案--------------------
我还是很有发言权的呀,我毕业设计就是写的这个(不过当时用的是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)。

呵呵 ,有问题在交流,以上有些概念可能说的不对,呵呵