現在のマシンからリモート ホストへの接続のおおよその制限を調べる必要があります。理想的には、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) で使用します。