Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42379
  • 博文数量: 20
  • 博客积分: 850
  • 博客等级: 准尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-05 22:14
文章分类

全部博文(20)

文章存档

2011年(1)

2009年(12)

2008年(7)

我的朋友

分类: Java

2008-11-17 17:07:54

想帮别人制作一个毕业设计,也是我这个菜鸟即将独立完成的一个相对还算个项目的东西。
计划实现功能:
登录 好友管理 聊天 文件传送 群 论坛 个人主页
首先实现桌面程序的部分,也就是类似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) |
给主人留下些什么吧!~~