1

現在のマシンからリモート ホストへの接続のおおよその制限を調べる必要があります。理想的には、Java を使用する任意の OS で動作するはずです。この場合、リモート ホストに大量に接続すると接続制限に達し、OS によっては BindException または ConnectException または SocketException が発生します。

現在のネットワーク アクティビティと OS 設定 (ulimit など) に依存するため、この制限を取得する正確な方法はないと思います。そのため、堅牢で経験的な方法を見つけようとしています。

現在、例外が発生するまで、可能な限り最高の速度で接続を開いています (1 マイクロ秒ごと、それ以下の場合 - VM InternalError が発生しました)。その後、速度を次number of connections so far / durationのように計算します。

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);
}

>>> 全コードはこちら

より良い/堅牢な方法はありますか? 少なくとも主要な OS (Linux/MacOS/Win) で使用します。

4

1 に答える 1

0

私が知っているように、あなたは正しいです - 正確な方法はありません。それは(別の)マシンの設定に依存し、あなたが制御していないものです。あなたが提供した方法は、別のマシンの接続制限をテストする方法に関する複数の方法の 1 つです。ハッピーハッキング:-)

于 2013-06-29T13:44:20.863 に答える