您的位置:首页 > 其它

关于使用nio实现广播数据给所有已连接客户端

2014-07-01 23:47 309 查看
NIO基础学完了,NIO学会不难,但是能达到实际做项目的地步还是需要花很大的精力和时间来专研的,若不能非常熟练使用NIO,那么NIO对你来说就是一个坑,你会发现辛辛苦苦写完的程序会出现各种问题,特别是在较大并发、较大数据量时,问题会非常的明显。

之前写的一遍博客《Java NIO实战之聊天室》,这个小程序其实是有问题的,在低并发的情况下可以较好的运行,但是在很多客户端同时连接服务器的高并发情况下就会出现问题,目前经过测试在很多客户端同时连接服务器时会抛出ConcurrentModificationException。其原因是在遍历已注册键时,有客户端连接修改了Selector的已注册键集合。这几天我也一直在思考如何解决这个问题,但是一直没想到一个自觉非常完美的解决方案,在网上也找了很多文章看,但很难找到答案。目前自己能够想到的方案就是单独维护客户端通道的Map,并对这个Map同步,当有客户端连接时,先对这个Map加锁,然后将客户端SocketChannel加入这个Map,若无法获得锁就等待;当遍历这个Map进行转发消息时,也先对这个Map加锁。感觉这样做是一种非常低性能和比较笨的办法。但是到现在也没有找到一个非常好的解决方法,可能是对NIO理解的还不够深入,还需苦逼专研。

为了不浪费时间,NIO我先放一边,虽然对NIO还没有达到运用的非常熟练的地步,但是基本用法及核心类API都了解的非常清楚了。现在开始学习netty,希望能用netty从寻得启发。网上都说现在用java开发网络程序首选netty,因为netty封装的好用、性能高、社区活跃,之前面试了2家游戏公司,他们在项目中也是用的netty,决定专研netty。netty学会了,希望能坚持下去再学学mina。技术人得有技术人应有的态度,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐