为何在nio模式下无法设置setSoTimeout

ljh410
04-06-29 4 1749

SocketChannel incomingChannel = readyChannel.accept();
Socket tmpSocket = incomingChannel.socket();
tmpSocket.setSoTimeout(120000);

以上代码是在nio的模式下,通过设置socket的超时来缓解恶意用户的攻击,但是实际却无法得到相应的效果,即setSoTimeout无法生效,但是不会报错.
如果不这样实现,请问一下咳有没有别的方法可以防止恶意用户的DOS攻击.

就像你telnet到一个服务器上 如果超过一定的时间没有发信息就自动会被挂断的那样,服务器是怎么实现的?用原来的阻塞模式都没有问题!

banq
2004-07-03 14:25

防DDOS攻击不是从应用程序方面解决的,必要从操作系统层面解决,从TCP底层解决,具体可参考购买或租用“黑洞”这样专用防火墙,我用过,效果不错。

fiddle
2004-07-13 16:57

自己写代码解决,用一个SocketManager管理所有的socket,并定时判断状态

fiddle
2004-07-13 16:59

还有,nio对这个问题的敏感性远比阻塞式的server要弱很多,很多情况下都可以忽略这个问题。idle的连接几乎不会产生什么损耗,也不会降低nio服务器的性能。

ljh5
2004-07-20 13:13

总觉得nio比原来的阻塞方式有很多好处 但是也有一些不足的地方
在性能方便是有很大的提高
但是上面的问题没有解决就很 系统就显得很脆弱
试想如果有一个用户就写一个小的程序 同时连到你的服务器上
那么java肯定会出现告警
java.io.IOException: Too many open files
不信大家可以试试
这个是由于系统中文件描述有一个定义的数值
所以才一定要解决timeout的问题