SNMP4J サーバー接続タイムアウト問題の解決策

SNMP4J サーバー接続タイムアウト問題の解決策

弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP/IP プロトコルを使用して、クライアントとしてスイッチを介してネットワーク管理センターと通信します。

SNMP は単なるプロトコル パッケージです。SNMP で使用される Java ツールキットである SNMP4J は、便利で安全なツールキット機能を提供します。

しかし、使用中に問題が見つかりました。サーバーとクライアントがメッセージを送信すると、数回送信した後、データが送信されなくなりました。ネットワーク パケットのキャプチャも失敗し、ブレークポイントをトレースした後、SNMP4J コードに問題が見つかりました。

	/**
	 * 指定されたアドレスに SNMP メッセージを送信します。
	 * 
	 * @param アドレス
	 * <code>TcpAddress</code>。
	 * <code>ClassCastException</code> がスローされます。
	 * <code>address</code> は <code>TcpAddress</code> ではありません
	 * 実例。
	 * @param メッセージ
	 * byte[] 送信するメッセージ。
	 * @throwsIOException 例外をスローします
	 */
	public void sendMessage(Address アドレス、byte[] メッセージ)
			java.io.IOException をスローします {
		if (サーバー == null) {
			聞く();
		}
		serverThread.sendMessage(アドレス、メッセージ);
	}

UDP との違いは、サービス スレッドを使用している点であることがわかります。

	public void sendMessage(Address アドレス、byte[] メッセージ)
			java.io.IOException をスローします {
		ソケット s = null;
		SocketEntry エントリ = (SocketEntry) sockets.get(address);
		ロガーがデバッグ有効の場合
			logger.debug("宛先への接続を検索しています '"
					+ アドレス + "' が返されました: " + エントリ);
			ロガー.デバッグ(sockets.toString());
		}
		if (エントリ != null) {
			s = エントリ.getSocket();
		}
		s == null の場合 || (s.isClosed()) || (!s.isConnected())) {
			ロガーがデバッグ有効の場合
				logger.debug("アドレス ' のソケット" + アドレス
						+ "' は閉じられており、開くと...");
			}
			保留中。削除(エントリ);
			ソケットチャネル sc = null;
			試す {
				// チャネルを開き、非ブロッキングに設定し、開始します
				// 接続する
				sc = SocketChannel.open();
				sc.configureBlocking(false);
				scで
						.connect(新しいInetSocketAddress(
								((TcpAddress) アドレス).getInetAddress(),
								((TcpAddress) アドレス).getPort()));
				s = sc.socket();
				エントリ = 新しい SocketEntry((TcpAddress) アドレス、s);
				エントリ.addMessage(メッセージ);
				sockets.put(アドレス、エントリ);
	
				同期済み(保留中){
					保留中。追加(エントリ);
				}
	
				セレクター.wakeup();
				logger.debug("" + アドレスに接続しようとしています);
			} キャッチ (IOException iox) {
				ロガーエラー(iox);
				iox を投げる;
			}
		} それ以外 {
			エントリ.addMessage(メッセージ);
			同期済み(保留中){
				保留中。追加(エントリ);
			}
			セレクター.wakeup();
		}
	}

彼は Map から接続 SocketEntry を取得し、次に接続オブジェクト Socket を取得します。

ソケットが有効かどうかを判断します。有効な場合は、直接送信します。無効な場合は、送信する前に接続を作成します。

そして私はこのコードを見つけました

プライベート同期void timeoutSocket(SocketEntryエントリ) { 
  接続タイムアウト > 0 の場合 
    socketCleaner.schedule(新しいSocketTimeout(entry)、connectionTimeout); 
  } 
}

つまり、サーバーが接続自体をチェックし、クリアするのです。

connectionTimeoutの値を設定してみました

プライベートvoid init()はUnknownHostException、IOExceptionをスローします{ 
  スレッドプール = ThreadPool.create("トラップ", 2); 
  ディスパッチャー = 新しい MultiThreadedMessageDispatcher(threadPool、新しい MessageDispatcherImpl()); 
  // ローカル IP とリスニング ポート listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055")); 
  DefaultTcpTransportMapping トランスポート; 
  トランスポート = 新しい DefaultTcpTransportMapping((TcpAddress) listenAddress); 
  トランスポート.setConnectionTimeout(0); 
  snmp = 新しい Snmp(ディスパッチャ、トランスポート); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しいMPv1()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しい MPv2c()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しいMPv3()); 
  USM usm = 新しい USM(SecurityProtocols.getInstance()、新しい OctetString(MPv3.createLocalEngineID())、0); 
  セキュリティモデルを取得します。セキュリティモデルを追加します(usm); 
  snmp.listen(); 
}

DefaultTcpTransportMapping のタイムアウトを 0 に設定するコード行を追加します。

そうすれば問題はありません!

問題は一時的に解決しましたが、SNMP4J についての私の深い理解が不足しているため、問題はこれではない可能性があります。

私もツールとしてSNMP4Jを使いたいのですが、サーバーとしてデータ送信時の問題の解決策があります!

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 操作タイムアウトがないときにMySQLサーバーがアクティブに切断される問題を解決します
  • WeChatサーバーにリクエストするミニプログラムサーバーのタイムアウトの解決策
  • PHP での curl および soap リクエスト サービスのタイムアウト問題の解決方法
  • Java の非同期マルチスレッド タイムアウトによって発生するサービス例外についての簡単な説明
  • Nginxサーバーでタイムアウトを設定する方法の詳細な説明
  • 構成された DNS サーバーが応答しないため、Win7 システム ログに「ドメイン名」の名前解決のタイムアウトが期限切れになったことが示されます。
  • ORA-12170 TNS の解決策: Oracle リモート サーバーへの接続時に接続タイムアウトが発生する
  • FileZilla を使用してサーバーに接続するとタイムアウトが発生する

<<:  Vue における属性とプロパティの具体的な使用法と違い

>>:  削除、切り捨て、ドロップの違いと選択方法

推薦する

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...

MySQL ビューの原理と基本操作例

この記事では、例を使用して、MySQL ビューの原理と基本操作を説明します。ご参考までに、詳細は以下...

JavaScript を使用したコマンドライン アプリケーションの構築

目次1. ノードをインストールする2. Commander.jsをインストールする3. JavaSc...

Weibo の一括フォロー解除機能を実装する JavaScript コード

Weibo ユーザーのフォローを一括で解除するクールな JavaScript コードWeibo には...

Tinymce リッチテキストを使用して Vue のツールバーボタンをカスタマイズする実践

目次tinymce、tinymce ts、tinymce-vue 宣言ファイルをインストールするパッ...

CSSを使用してダークモードとブライトモードを切り替える

Web Skills第5号では、CSSでダークモードやハイライトモードを実装するための技術的なソリュ...

CSS最適化スキルの自己実践体験

1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...

カルーセルバナーの自動回転効果を実現する純粋な CSS

さっそくコードを見てみましょう * { マージン: 0; パディング: 0; } 。容器 { マージ...

MySQLの主キーとユニークキーの重複挿入の解決策の詳細な説明

目次解決: 1. 無視する2. 交換する3. 重複キーの更新についてデータを挿入するときに、重複した...

React Routerの歴史について簡単に説明します

React Router を理解したいなら、まず歴史を理解する必要があります。より具体的には、Rea...

Linux に nodejs 環境とパス構成をインストールするための詳細な手順

Linux に Node.js をインストールする方法は 2 つあります。1 つは簡単で、解凍して使...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

この記事では、トランザクション、インデックス、ロックなどの MySQL の知識ポイントの原理と使用法...

React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)

私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...