基于C++ Builder 5的Socket组件实现的聊天程序(四)
现在服务端程序和客户端程序都完成了,当然还存在很多问题,其中最大的一个问题就是,我在同一台机器上开多个客户端程序,比如开三个,分别用“大毛”、“二毛”和“三毛”三个用户登陆,聊天时有个问题时有时无,先不管他了,当有用户离开时就出现问题了,都成功登陆后服务端图片:
大家可以发现,大毛、二毛和三毛的IP地址都一样,当有用户离开时服务器是怎么处理的呀?再来看看服务器的onDisConnect事件的响应函数的代码
AnsiString sTemp;
sTemp.sprintf("%s断开连接!",Socket->RemoteAddress);
StatusBar1->SimpleText = sTemp;
int iIndex;
iIndex = ListUserAddr->Items->IndexOf(Socket->RemoteAddress);
ListUserAddr->Items->Delete(iIndex); // 在地址表中删除这个用户的IP地址
ListUserName->Items->Delete(iIndex); // 在昵称表中删除这个用户的用户名
服务器是根据客户端发过来的IP地址进行判断并从IP地址列表和用户名列表里删除相应的用户,但是我们看到三个毛的IP地址都一样,这该怎么办呢?接下来咱让三毛离开,再看一下服务端的运行截图:
0000
我明明是让三毛离开了啊,怎么服务端把大毛删除了,留下二毛和三毛呢?由代码
int iIndex;
iIndex = ListUserAddr->Items->IndexOf(Socket->RemoteAddress);
不难看出,程序只执行了一次判断,其实也称不上判断,正好第一个IP地址等于三毛发过来的IP地址,所以就把IP地址列表的第一个地址的位置赋值给 iIndex ,然后删除,其实IP地址列表的IP地址都一样,可惜他没往下执行,大毛很倒霉,在最上面,所以被删除了。
客户端也有问题,再看一下三毛离开后大毛和二毛的客户端的截图:
他们的列表还有三毛,也有大毛,说明服务器并没有把离开的用户信息发给其他的客户端,其实即便是发了也不行,还发IP地址?显然不行,那发用户名呢?也不行,因为如果三个客户登陆时用户名都是“大毛”怎么办?QQ里昵称重名的多的是,注册QQ时也没说不让和别人重名啊!
当然有办法解决,就是一个机器只运行一个客户端,然后用户名也都不一样,这样就不存在上面的问题了,但是这样逃得了一时逃不了一世,QQ没说一个机器只能运行一个客户端吧!
其实解决这个问题很简单,就是每当新客户登陆时,服务器就给他分配一个ID号,而且这个ID一个客户一个,而且都不一样,这样不就行了吗?咱们QQ号没有一样的吧。我感觉在这里用上数据库实现起来就更简单了。好了,这个问题就解决了,就交给大家来实现吧,呵呵!
至于使用数据库以后再讨论。
上面有什么不足的地方,恳请大家提出宝贵意见,希望和大家一起学习,共同进步!