绿皮驿站

杂记
浅谈BIO与NIO

年初的时候,我开发了一款名叫《寒剑传说0.2》的联网小游戏,既然是0.2,当然有0.1啦,不过0.1的版本没什么功能,就不提及了或日后再提。 

传说0.2的客户端使用了网上流传的GGELUA,就是一个用脚本语言Lua封装的引擎。 重点是服务端,使用的是java.net里面的ServerSocket。 

此处省略N个字... 开发完毕,挂上服务器,跑起来,叫上朋友们一起来玩。一两个人的时候没什么感觉,达到四五六个的时候,出现明显的卡顿,而且服务器的CPU满载100%。 

吓得我赶紧关闭,然后思考人生。 


直到有一天我发现个奇怪的包java.nio,就在java.net下面。充满好奇的我当然是选择打开百度去搜,这里插句题外话,主要是用百度来搜CSND上一些大神的博客。 

经过几天的学习,ServerSocket是BIO,同步阻塞,100个连接,100个线程。ServerSocketChannel是NIO,同步非阻塞,100个连接,1个线程。

BIO适合连接数量少的和传输量大的服务端,而NIO适合连接数量多但传输量较少的服务端。 

于是,我赶紧把服务端换成NIO的,结果负载量有显著的提示,并且CPU不是100%,看着就舒服多了。 

据说NIO有个bug,就是在select的时候会出现死循环,不过我目前还没碰过到过,这种情况只能搞个检测程序,然后重启服务端了。

很多人说NIO难用,可能我用的功能比较初级吧,我觉得挺好用的,最近看到有NIO的框架Netty,打算去学一学。

对了,Java7的时候出了AIO,这个就是异步非阻塞的,有机会再看看怎么用吧。

晚安。


发布于 2017年10月2日   浏览(2,471)