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 における属性とプロパティの具体的な使用法と違い

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

推薦する

非表示のフォームテキストを表示するJavaScript

この記事では、フォームの隠しテキストを表示するためのJavaScriptの具体的なコードを参考までに...

Vue.js ディレクティブのカスタム命令の詳細な説明

デモコマンドをカスタマイズするVue カスタム ディレクティブの構文は次のとおりです。 Vue.di...

Linuxグループの基礎知識ポイントまとめ

1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...

MySQLインデックスを追加する3つの原則を簡単に理解する

1. インデックスの重要性インデックスは、列に特定の値を持つ行をすばやく見つけるために使用されます。...

スケジュールされた時間に古いジャンクファイルを自動的に削除する Linux 用の Autotrash ツール

Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...

vue3.0 のウォッチ リスナーの例の詳細な説明

目次序文リスナーと計算プロパティの違いvue3 で watch を使用するにはどうすればいいですか?...

Ubuntu の空き容量を増やす 5 つの簡単な方法

序文ほとんどの人は、システム ディスク ストレージが少ないときにこの操作を実行するか、Linux シ...

Vueの学習手順

目次1. v-text (v-instruction name = "variable&q...

Linux コマンドを素早く習得する 4 つの方法

Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...

JS クロスドメイン ソリューション React 構成 リバース プロキシ

クロスドメインソリューションjsonp (get をシミュレート) CORS (クロスオリジンリソー...

HTMLページがincludeを使用してphpファイルをインポートした後に余分な空白行があります

インターネットで見つけた方法は効果的ですinclude によって導入されたフッター ファイルとヘッダ...

Vue の計算プロパティ

目次1. 基本的な例2. 計算プロパティキャッシュとメソッド3. 計算プロパティセッター序文:通常、...

Vue+SpringBoot で Alipay サンドボックス決済を実装するためのサンプルコード

まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...

HTML でフォントの色を設定する方法と、PS を使用して HTML で正確なフォントの色を取得する方法

1. HTMLフォントカラー設定HTML では、フォント タグを使用してフォント コンテンツの色を設...

Tomcatc3p0 で jnid データ ソースを構成する 2 つの実装方法の分析

c3p0の使用c3p0jarパッケージをインポートする <!-- https://mvnrep...