弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Vue における属性とプロパティの具体的な使用法と違い
この記事では、フォームの隠しテキストを表示するためのJavaScriptの具体的なコードを参考までに...
デモコマンドをカスタマイズするVue カスタム ディレクティブの構文は次のとおりです。 Vue.di...
1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...
1. インデックスの重要性インデックスは、列に特定の値を持つ行をすばやく見つけるために使用されます。...
Autotrash は、古い削除済みファイルを消去するプロセスを自動化するコマンド ライン プログラ...
目次序文リスナーと計算プロパティの違いvue3 で watch を使用するにはどうすればいいですか?...
序文ほとんどの人は、システム ディスク ストレージが少ないときにこの操作を実行するか、Linux シ...
目次1. v-text (v-instruction name = "variable&q...
Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...
クロスドメインソリューションjsonp (get をシミュレート) CORS (クロスオリジンリソー...
インターネットで見つけた方法は効果的ですinclude によって導入されたフッター ファイルとヘッダ...
目次1. 基本的な例2. 計算プロパティキャッシュとメソッド3. 計算プロパティセッター序文:通常、...
まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...
1. HTMLフォントカラー設定HTML では、フォント タグを使用してフォント コンテンツの色を設...
c3p0の使用c3p0jarパッケージをインポートする <!-- https://mvnrep...