这一段时间公司的项目不是特别的紧,无事之余我突然有一种想开发一个聊天工具的
想法,于是就一步一步做了起来。
首先是对于目前网络上经常使用到的聊天工具进行了分析,对于我来说最熟
悉的就是QQ。我对使用QQ的操作以及QQ的执行过程进行了仔细的观察,当然观察的内
容也只是和我想做的部分相关,之余QQ游戏之类没有做详细的调研。我想对于QQ这样
一个聊天工具平台而言,主要的架构几乎肯定是C/S的结构。腾讯公司有自己的QQ服务
器,每个QQ用户具有QQ客户端。对于一个普通用户而言,使用QQ的过程大家都是十分
熟悉的,肯定是先要登录QQ网站申请QQ账号,然后打开QQ客户端输入ID号与PassWord
登录QQ服务器,然后与好友聊天或在自己的群中聊天。
我在做我的聊天工具的过程中一直在考虑几个问题:
1客户端与服务器究竟是TCP连接,还是UDP连接?对于每个客户端而言,登
陆时服务器需要做那些工作?
我的聊天工具采用了TCP连接,我在服务器中创建了一个监听套接字,监听
客户端发送的连接请求。当有一个客户端准备上线时将向服务器发送连接请求,监听
套接字将创建data socket与此客户端进行对话。然后用户输入ID和PassWord进行登录
,客户端将把ID和PassWord发送给服务器,服务器接收到登录信息后将查询用户信息
数据库,检查登录信息是否正确。如果登录信息有误则服务器向客户端发送出错提示
,如果正确会进一步检索数据库,找到此客户的好友并发送好友信息至客户端。
也就是说,服务器会对客户端的登录信息进行数据库检查,会将客户端的
好友信息发送给客户端。前几天看了别人对于OICQ的评述,有人认为在客户端登录时
,对于用户登录信息的CHECK首先是在客户端完成的,也就是说如果你过去在某台电脑
上用过OICQ,那么的你上次输入的密码将被保存在本地,当然密码是加密的,当你再
次在这台电脑上登录时,客户端会首先将你输入的信息与本地保存的信息进行比较,
如果正确就算是登陆成功,如果不正确会与服务器连接,服务器会去查询数据库。我
觉得这个登录的采取方案最大的好处就是减轻了服务器的压力,服务器少查询了一次
数据库。另外,我的聊天工具的服务器会在客户端登陆成功以后,将客户的好友信息
放送给客户端。这里的好友信息包括好友的id、nickname、好友目前的ip、好友的状
态(在线或是离线或是隐身),但是我观察了QQ当你的网络处于离线状态时,你登录
QQ,虽然无法登陆但是却能显示出你的好友,当然他们都是离线的,这说明好友的信
息部分是存在本地机器中(前提是以前你至少在这一台电脑上用过一次QQ)。这种实
现机制的好处也是减轻了服务器的负担,同时也减轻了客户端的负担,每一次用户成
功登录以后,服务器不在需要向客户端传递其好友的信息,那么好友的目前状态信息
由谁来通知呢?我想最好的办法就是由好友自己来传递。