我需要找出当前机器与远程主机的连接的近似限制,理想情况下它应该适用于任何带有java的操作系统。 在大规模连接到远程主机时达到连接限制,并且在这种情况下取决于操作系统,获取BindException或ConnectException或SocketException。
我认为没有确切的方法可以获得此限制,因为它取决于当前的网络活动和操作系统设置(例如ulimit),所以我试图找到一种强大的经验方法。
目前我正以最高速率打开连接(每1微秒,如果更少 - 我得到一个VM InternalError),直到我得到异常然后计算速率为:number of connections so far / duration
,我使用Netty,这里,这里是代码,主循环:
while (!Thread.currentThread().isInterrupted() && !stop) {
try {
ChannelFuture future = bootstrap.connect(addr);
connected.incrementAndGet();
} catch (ChannelException e) {
if (e.getCause() instanceof SocketException) {
stop = handleLimitErrors(e.getCause());
}
}
TimeUnit.MICROSECONDS.sleep(1);
}
netty渠道处理程序:
private class ErrorHandler extends SimpleChannelUpstreamHandler {
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
e.getChannel().close();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
Throwable exc = e.getCause();
e.getChannel().close();
if (exc instanceof BindException || exc instanceof ConnectException) {
stop = handleLimitErrors(exc);
}
}
}
和反击:
private boolean handleLimitErrors(Throwable e) {
return (errors.incrementAndGet() > 10);
}
有更好/更强大的方式吗? 我将至少在任何主要操作系统(Linux / MacOS / Win)上使用它。
答案 0 :(得分:0)
我知道你是对的 - 没有确切的方法。这取决于(另一个)机器设置,它是你无法控制的。您提供的方式是关于如何测试另一台机器的连接限制的更多方法。快乐的黑客行为: - )