关于类似QQ软件的询问 QQ等程序聊天,双方是否使用SOCKET通信?应该不会都是通过服务器吧,那样服务器负担得多大啊?如果是SOCKET,那么多的好友,一下子得建立多少个啊?还得考虑上线下线隐身等乱七八糟的问题。请高手帮忙指点一下这种复杂程序的结构,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是SOCKET通信啊,那个服务器是N台的,我们现在的项目也是用socket的,测出socket平均每秒能有2000多个并发连接,这就可以了,2000个并发已经很高了 如果要在Java中用TCP/IP协议的话,要用socket了,我做过类似的项目,但是客户端的量不是很大,不会达到几十万的程度,感觉还可以啊,要不行的话用几个服务器也可以的 那请问,是不是正常情况下只是QQ跟服务器的连接,先发送消息的一方将消息发给服务器,如果对方在线就建立SOCKET,如果不在线就储存在服务器里。一定时间内如果没有通信,则断开SOCKET。客户端定期发消息给服务器证明自己在线。然后服务器发现客户端下线,发送给其好友下线消息,或者其他方式。这个就差不多了? 这样的, 你和我聊天,你和我有一个socket(有超时限制) 你和服务器有一个socket(但这个不用于传输数据,只是检测你的状态) 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)。呵呵 ,有问题在交流,以上有些概念可能说的不对,呵呵 我还是很有发言权的呀,我毕业设计就是写的这个(不过当时用的是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)。有问题在交流,以上有些概念可能说的不对,呵呵 红颜色的内容,意思理解得不是很明白。备注一点:通过持有客户端的Socket,服务端是可以主动向客户端发送信息的。 我这个线程为什么终止不了?想了很久没想明白,麻烦大家帮我看看,谢谢! 关于JAVA工作的问题 问一个List与ArrayList的问题 Java可以实现计算机图形学么? 交友兼散分!!! 处女贴 JComboBox的使用 怎样清除POST方法后的变量? 编译出错,是什么原因? qw JAVA怎么给一个对象动态添加属性? session的removeAttribute()和invalidate()的区别
我们现在的项目也是用socket的,
测出socket平均每秒能有2000多个并发连接,
这就可以了,2000个并发已经很高了
如果对方在线就建立SOCKET,如果不在线就储存在服务器里。
一定时间内如果没有通信,则断开SOCKET。客户端定期发消息给服务器证明自己在线。
然后服务器发现客户端下线,发送给其好友下线消息,或者其他方式。
这个就差不多了?
Socket应该是针对TCP协议的。楼主,如果想编写一个通信程序,可以使用UDP,也可以使用TCP。我觉得,使用UDP协议比较好,但是,要确保信息包的丢失重传。
用户的在线状态,可以使用服务端轮询检测+客户端周期性报告的方式,进行状态同步。无论使用哪种协议传输数据,最好都要在传输协议上再封装一层协议。
这样便于管理。
我来说下我的思路吧:
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)。呵呵 ,有问题在交流,以上有些概念可能说的不对,呵呵
我来说下我的思路吧:
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)。有问题在交流,以上有些概念可能说的不对,呵呵