基于C++ Builder 5的Socket组件实现的聊天程序(四)

                               基于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号没有一样的吧。我感觉在这里用上数据库实现起来就更简单了。好了,这个问题就解决了,就交给大家来实现吧,呵呵!

至于使用数据库以后再讨论。

 

上面有什么不足的地方,恳请大家提出宝贵意见,希望和大家一起学习,共同进步!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值