想帮别人制作一个毕业设计,也是我这个菜鸟即将独立完成的一个相对还算个项目的东西。
计划实现功能:
登录 好友管理 聊天 文件传送 群 论坛 个人主页
首先实现桌面程序的部分,也就是类似QQ的一个东西。希望能达到最早年QQ的一些功能。
但是很多的细节在分析的时候都有障碍,所以搜集一些网友的建议。
1
是通过服务器建立的连接,但连接以后就是聊天双方的关系了,定时的向服务器发送一个消息,服务器判断是否在线,这就是为什么有的时候你的QQ下线了,对方仍然显示你在线,这种模式也叫混合模式,编程也不是很难实现
2
这样的, 你和我聊天,你和我有一个socket(有超时限制) 你和服务器有一个socket(但这个不用于传输数据,只是检测你的状态)
如果我不在线 ,才将数据发到服务器上
3
QQ使用的是UDP来传输消息的。
Socket应该是针对TCP协议的。
楼主,如果想编写一个通信程序,可以使用UDP,也可以使用TCP。
我觉得,使用UDP协议比较好,但是,要确保信息包的丢失重传。
用户的在线状态,可以使用服务端轮询检测+客户端周期性报告的方式,进行状态同步。
无论使用哪种协议传输数据,最好都要在传输协议上再封装一层协议。
这样便于管理。
4
我还是很有发言权的呀,我毕业设计就是写的这个(不过当时用的是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,服务端是可以主动向客户端发送信息的。
原因很简单,你内网有十台机器,但是他们的外网ip都一样 如202.118.194.201,当外网机向这个地址发起连接?他是连192.168.0.2,还是192.168.0.3,192.168.0.4?....?
阅读(498) | 评论(0) | 转发(0) |