我需要找出从当前机器到远程主机的连接的大致限制,理想情况下它应该可以在任何带有 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);
}
网络频道处理程序:
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)上使用它。