1

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

4

1 回答 1

0

我知道你是对的 - 没有确切的方法。这取决于(另一台)机器设置,这是您无法控制的。您提供的方式是关于如何测试另一台机器的连接限制的更多方式之一。快乐的黑客:-)

于 2013-06-29T13:44:20.863 回答