30、Nio(select(处理用户端断开(有read事件)))

Nio(select(处理用户端断开(有read事件)))

首先我们要有个理解:我们的客户端不管是强制停止,还是正常断开都会触发一个read事件(只是正常断开的read返回的值是-1)

第一步:我们强制停止客户端

服务器出现异常(因为我们的客户端已经强制关闭了,我们的客户端想要再去read就会出现io异常)

第二步:处理方式(我们先给他try catch捕获一下异常)ctrl+alt+T快捷键

此时服务器端一直运行,只是服务器没有停止了

因为我们捕获异常后,这个异常还会进入外层的循环,客户端强制停止后还会触发一个read事件(进入我们集合),但是这个key我们并没有进行处理。没有处理那么这个select这个方法就不会阻塞住(一直运行)

第三步:再次优化(我们去将这个key从集合里里面删除)

这里没有问题了,我们的这里是打印了一下异常(e.printS...)

第四步:还有个问题,客户端正常断开(服务器端又停不下了),因为我们正常断开也会产生一个read事件,且不会被异常捕获咯,那么这个正常key就不会被删除咯

优化:我们区分正常断开和异常断开,思路我们正常断开read返回的是-1这样来判断

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127820967