Als Verwaltungszentrale und Server dient dabei unser Netzwerkmanagementcenter! Jedes verwaltete Gerät kommuniziert über den Switch als Client mit dem Netzwerkverwaltungszentrum und verwendet dabei das TCP/IP-Protokoll! SNMP ist nur ein Protokollpaket. SNMP4J, ein von SNMP verwendetes Java-Toolkit, bietet praktische und sichere Toolkit-Funktionen! Bei der Nutzung ist jedoch ein Problem aufgetreten: Wenn Server und Client Nachrichten senden, kommt es nach mehrmaligem Senden nicht mehr zum Datenaustausch! Auch die Erfassung der Netzwerkpakete war nicht erfolgreich und nach der Verfolgung des Haltepunkts wurde ein Problem im SNMP4J-Code entdeckt! /** * Sendet eine SNMP-Nachricht an die angegebene Adresse. * * @param Adresse * eine <code>TcpAddress</code>. Eine * <code>ClassCastException</code> wird geworfen, wenn * <code>Adresse</code> ist keine <code>TcpAddress</code> * Instanz. * @param Nachricht * byte[] die zu sendende Nachricht. * @throws IOException */ public void sendMessage(Adresse Adresse, Byte[] Nachricht) wirft java.io.IOException { wenn (server == null) { Hören(); } serverThread.sendMessage(Adresse, Nachricht); } Wir können sehen, dass der Unterschied zu UDP darin besteht, dass es einen Service-Thread verwendet! public void sendMessage(Adresse Adresse, Byte[] Nachricht) wirft java.io.IOException { Sockel s = null; SocketEntry-Eintrag = (SocketEntry) sockets.get(Adresse); wenn (logger.isDebugEnabled()) { logger.debug("Suche nach Verbindung für Ziel '" + Adresse + "' zurückgegeben: " + Eintrag); logger.debug(sockets.toString()); } wenn (Eintrag != null) { s = Eintrag.getSocket(); } wenn ((s == null) || (s.isClosed()) || (!s.isConnected())) { wenn (logger.isDebugEnabled()) { logger.debug("Socket für Adresse '" + Adresse + "' ist geschlossen, beim Öffnen..."); } ausstehend.entfernen(Eintrag); SocketChannel sc = null; versuchen { //Öffne den Kanal, stelle ihn auf nicht blockierend ein, initiiere // verbinden sc = SocketChannel.open(); sc.configureBlocking(false); sc .connect(neue InetSocketAdresse( ((TcpAddress) Adresse).getInetAddress(), ((TcpAddress) Adresse).getPort())); s = sc.socket(); Eintrag = neuer SocketEntry((TcpAddress) Adresse, s); Eintrag.addMessage(Nachricht); sockets.put(Adresse, Eintrag); synchronisiert (ausstehend) { ausstehend.hinzufügen(Eintrag); } Selektor.wakeup(); logger.debug("Verbindungsversuch mit " + Adresse); } Fang (IOException iox) { logger.fehler(iox); iox werfen; } } anders { Eintrag.addMessage(Nachricht); synchronisiert (ausstehend) { ausstehend.hinzufügen(Eintrag); } Selektor.wakeup(); } } Er holt die Verbindung SocketEntry von einer Map und holt dann das Verbindungsobjekt Socket! Bestimmen Sie, ob der Socket gültig ist. Wenn er gültig ist, senden Sie ihn direkt. Wenn er ungültig ist, stellen Sie vor dem Senden eine Verbindung her! Dann habe ich diesen Code gefunden private synchronisiert void timeoutSocket(SocketEntry entry) { if (VerbindungsTimeout > 0) { socketCleaner.schedule(neuer SocketTimeout(Eintrag), VerbindungsTimeout); } } Das heißt, der Server prüft die Verbindung selbstständig und baut diese ab! Ich habe versucht, den Wert von connectionTimeout festzulegen private void init() wirft UnknownHostException, IOException { ThreadPool = ThreadPool.create("Falle", 2); Dispatcher = neuer MultiThreadedMessageDispatcher (ThreadPool, neuer MessageDispatcherImpl ()); // Lokale IP und Abhörport listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055")); DefaultTcpTransportMapping-Transport; transport = neue DefaultTcpTransportMapping((Tcp-Adresse) listenAdresse); transport.setConnectionTimeout(0); snmp = neues Snmp(Dispatcher, Transport); snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv3()); USM usm = neues USM(SecurityProtocols.getInstance(), neuer OctetString(MPv3.createLocalEngineID()), 0); : SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); } Fügen Sie eine Codezeile hinzu, um das Timeout von DefaultTcpTransportMapping auf 0 zu setzen! Dann gibt es kein Problem! Obwohl das Problem vorübergehend gelöst wurde, befürchte ich, dass es aufgrund meiner mangelnden Kenntnisse von SNMP4J nicht daran liegt! Ich hoffe auch, dass SNMP4J als Tool und als Server verwendet werden kann, da es eine Lösung für das Problem beim Senden von Daten gibt! Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Die spezifische Verwendung und der Unterschied zwischen Attribut und Eigenschaft in Vue
>>: Der Unterschied zwischen Löschen, Abschneiden und Löschen und wie man wählt
In diesem Artikel wird der spezifische Code von V...
Inhaltsverzeichnis 1. Anweisung einfügen 1.1 Einf...
1. readonly Nur-Lese-Attribut, so dass Sie den Wer...
1. Docker installieren yum installiere Docker #St...
Einführung in Git Git ist eine Open-Source-Versio...
Bereiten Sie eine CentOS6-Installationsdiskette (...
1. Importieren Sie das Modul und definieren Sie e...
Wenn Sie ein Arbeitgeber fragt, ob in einer MySQL...
Die Methoden und Konzepte privater und globaler F...
Inhaltsverzeichnis 1. Umgebungskonfiguration 1.NT...
SMIL fügt Unterstützung für Timing und Mediensync...
MySQL-Download-Adresse: https://obs.cn-north-4.my...
Notieren Sie den Fehler, der mich heute den ganze...
1. Installieren Sie die virtuelle Maschine Hyper-...
1. Entpacken Sie das Zip-Paket in das Installatio...