Dieses Beispiel teilt den spezifischen Implementierungscode für das Lesen des Benutzeranmeldes und zum Hochladen von Server für Ihre Referenz. Der spezifische Inhalt ist wie folgt
Der Client läuft auf einem Server, der dem Benutzer UNIX -Dienste zur Verfügung stellt. Wird verwendet, um die vorgelagerten und nachgeschalteten Informationen von Benutzern auf dem Server zu lesen und zu sammeln, sich zu passen und zu organisieren, und senden Sie sie anschließend an den Server, um eine Zusammenfassung zu erhalten.
Spezifischer Implementierungscode:
1. DMSSERVER.JAVA
Paket com.dms; Import Java.io.BufferedReader; Import Java.io.file; Import Java.io.fileOutputStream; Import Java.io.ioxception; Import Java.io.inputStreamReader; Import Java.io.IO.OutputStreamwriter; Import. java.util.hashMap; import Java.util.list; import Java.util.map; Import Java.util.Concurrent.Blockingqueue; Import Java.util.Concurrent.executorservice; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.saxreader; /** * DMS -Server, das zum Empfangen von * Pairing -Protokollen von jedem Client verwendet und in einer lokalen Datei gespeichert wird // Thread -Pool zum Verwalten von Threads, mit denen Client -Anfragen private ExecutorService -Threadpoole behandelt werden; // Alle Dateien speichern, die von Clients gesendet werden, um Protokolle private Datei ServerLogfile zu kombinieren. // Message Queue Private BlockingQueue <String> messageQueue = new LinkedBlockingQueue <string> (); public dmSServer () löst Ausnahme aus {try {System.out.println ("Der Server initialisiert ..."); // 1 analysieren Sie die Konfigurationsdatei server-config.xml map <string, string> config = loadConfig (); // 2 initialisieren Sie das Attribut init (config); System.out.println ("Server -Initialisierung abgeschlossen ..."); } catch (Ausnahme e) {System.out.println ("Initialisierung fehlgeschlagen!"); werfen e; }} / *** Der erste Schritt bei der Initialisierung der Konstruktormethode besteht darin, die Konfigurationsdatei zu analysieren Document doc = reader.read (neue Datei ("server-config.xml"); Element root = doc.getrootelement (); Karte <String, String> config = new HashMap <String, String> (); /** ALLE SUBAGs in das <config> -Tag* erhalten und speichern Sie den Namen jedes Untertags als Schlüssel, und der* Text in der Mitte ist der Wert in der Kartensammlung*/ list <element> list = root.elements (); für (Element E: Liste) {string key = e.getName (); String value = e.getTextTrim (); config.put (Schlüssel, Wert); } return config; } catch (Ausnahme e) {System.out.println ("Konfigurationsdatei -Ausnahme!"); E. printstacktrace (); werfen e; }} /** * Der zweite Schritt zur Initialisierung der Konstruktormethode besteht darin, das Attribut gemäß dem Konfigurationselement zu initialisieren erstellt. Dieser Wert wird als Anzahl der Thread -Pool -Threads verwendet.* Initialisieren Sie die Eigenschaft in der Konfigurationsdatei: Server. Hier ist der Server -Port von ServerSocket*/ this.server = new ServerSocket (Integer.ParseInt (config.get ("Serverport")); this.serverLogFile = new Datei (config.get ("logrecFile")); this.threadpool = ausführende } /** * Methode zum Arbeiten auf dem Server * @throws Exception * /public void start () löst Ausnahme aus { / * * Implementierungsanforderungen: * Starten Sie zuerst einen Thread separat, um den SavelogHandler * Diese Aufgabe zu speichern, um alle Paarungsprotokolle * zu speichern und dann den Server -Ports -Loop anzuhören. Sobald ein Client angeschlossen ist, * übergeben Sie einen ClientHander und übergeben Sie die Aufgabe an den Thread -Pool *, um Threads zuzuweisen, um die Interaktion mit dem Client zu verarbeiten. * */ try {system.out.println ("Der Server fängt an ..."); Saveloghandler slh = neuer saveloghandler (); neuer Thread (SLH) .Start (); while (true) {Socket Socket = server.accept (); threadpool.execute (New ClientHandler (Socket)); }} catch (Ausnahme e) {e.printstacktrace (); werfen e; }} public static void main (String [] args) {try {dmSserver server = new DMSServer (); server.start (); } catch (Ausnahme e) {System.out.println ("Station hat den Server nicht gestartet!"); }}} / ** * Dieser Thread ist dafür verantwortlich, jedes gepaarte Protokoll aus der Nachrichtenwarteschlange zu holen und ihn in die ServerLogfile -Datei zu speichern. try {pw = neuer Pressewriter (neuer FileOutputStream (ServerLogFile, True)); while (true) {if (messageQueue.size ()> 0) {pw.println (messageQueue.poll ()); } else {pw.flush (); Thread.Sleep (500); }}} catch (exception e) {e.printstacktrace (); } endlich {if (pw! = null) {pw.close (); }}}}} / ** * Behandeln Sie eine angegebene Client -Anforderung * @Author Administrator * * / private classhandler implements runnable {private Socket Socket; public ClientHandler (Socket Socket) {this.socket = Socket; } public void run () { / * * idee: * Empfangen Sie zuerst alle vom Client gesendeten gepaarten Protokolle, * bis "über" speichern, dann diese gepaarten * Protokolle in der lokalen Datei und antworten Sie auf den Client * "OK" *. Zeichenfolge "über". Wenn nicht, handelt es sich um ein gepaartes Protokoll und speichern Sie es in der lokalen Datei. Wenn ja, * Hör auf zu lesen. * 4: Antwort auf den Client "OK", nachdem er alle Protokolle erfolgreich gelesen hat */ Printwriter pw = null; try {// 1 pw = neuer Pressewriter (neuer Ausgangsstreamwriter (Socket.GetOutputStream (), "UTF-8")); // 2 BufferedReader BR = New BufferedReader (neuer InputStreamReader (Socket.getInputStream (), "UTF-8"); // 3 String message = null; while ((message = br.readline ())! = null) {if ("over" .equals (message)) {break; } // Schreiben Sie das Protokoll in eine Datei, um messagequeue.offer (meldung) zu speichern. } // 4 pw.println ("ok"); pw.flush (); } catch (Ausnahme e) {e.printstacktrace (); pw.println ("fehler"); pw.flush (); } endlich {try {// Die Verbindung vom Client trennen, um den Ressourcensocket zu veröffentlichen.CLOSE (); } catch (ioException e) {e.printstacktrace (); }}}}}}}}}}}}} 2. Dmsclient.java
Paket com.dms; Import Java.io.BufferedReader; Import Java.io.file; Import Java.io.ioxception; Import Java.io.inputStreamReader; Import Java.io.outputStreamwriter; import Java.io.io.printwriter; Java.util.hashMap; Import Java.util.List; Import Java.util.map; Import Java.util.Map.Entry; Import Java.util.set; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.saxreader; import com.dms.bo.logdata; import com.dms.bo.logrec; /*** Dieser Client wird auf dem Server ausgeführt, der den Benutzern UNIX -Dienste bietet. * Zum Lesen und Sammeln der stromaufwärts- und nachgeschalteten Informationen von Benutzern auf dem Server und * werden sie gepaart und sortieren und sie für eine Zusammenfassung an den Server senden. * @Author Administrator * */öffentliche Klasse DMSCLIENT {// Attributdefinition // Schritt 1: Analysieren Sie die erforderlichen Eigenschaften des Protokolls // Unix -Systemprotokolldatei Private Datei logfile; // Speichern Sie die Datei der privaten Datei an der Parsen -Protokolldatei textlogfile; // Lesezeichendatei private Datei LastPositionFile; // Anzahl der Einträge für jedes Parsing -Protokoll private int -Stapel; // Schritt 2: Kombinieren Sie die Attribute des Protokolls // die private Datei logrecfile; // die Datei private Datei loginlogfile speichern; // Schritt 3: Analysieren Sie die Attribute des Protokolls // Serveradresse Private String ServerHost; // Server Port Private Int Serverport; /*** Konstruktormethode, mit der die Client initialisiert wird. // Piling System.out.println (config); // 2 initialisieren Sie das Attribut init (config); } catch (Ausnahme e) {System.out.println ("Initialisierung fehlgeschlagen!"); werfen e; }} / ** * Initialisieren Sie den zweiten Schritt der Konstruktormethode, initialisieren Sie die Attribute gemäß dem Konfigurationselement * @param config * @throws Exception * / private void init (map <string, string> config) löst Ausnahme aus {try {logfile = new Datei (config.get ("logfile"); textLogfile = new Datei (config.get ("textLogfile")); LastPositionFile = new Datei (config.get ("LastPositionFile")); batch = integer.parseInt (config.get ("batch")); LOGRECFILE = NEW -Datei (config.get ("logrecFile")); loginlogfile = new Datei (config.get ("LoginLogfile")); serverhost = config.get ("serverhost"); serverport = integer.parseInt (config.get ("serverport")); } catch (Ausnahme e) {System.out.println ("Initialisierungseigenschaft fehlgeschlagen!"); E. printstacktrace (); werfen e; }} / ** * Der erste Schritt bei der Initialisierung der Konstruktormethode besteht darin, die Konfigurationsdatei zu analysieren Document doc = reader.read (neue Datei ("config.xml")); Element root = doc.getrootelement (); Karte <String, String> config = new HashMap <String, String> (); /** ALLE SUBAGs in das <config> -Tag* abrufen und den Namen jedes Untertags als Schlüssel verwenden. Der* im mittleren Text wird in der Kartensammlung als Wert*/ list <element> list = root.elements () gespeichert; für (Element E: Liste) {string key = e.getName (); String value = e.getTextTrim (); config.put (Schlüssel, Wert); } return config; } catch (Ausnahme e) {System.out.println ("Ausnahme von Konfigurationsdateien analysieren!"); E. printstacktrace (); werfen e; }} / *** Methode für den Client zum Arbeiten* Drei Schritte der Schleife:* 1: Analyse des Protokolls* 2: Paarung des Protokolls* 3: Senden Sie das Protokoll* / public void start () {parselogs (); MatchLogs (); sendLogs();// while(true){// // parse log// if(!parseLogs()){// continue;// }// // pairing log/// if(!matchLogs()){// continue;// }// // Send log// sendLogs();// } } /** * Step 3: Send log* @return true: Send successfully* false: Send fehlgeschlagen* / private boolean sendLogs () { /** Implementierungsidee:* Lesen Sie alle gepaarten Protokolle in der logrecFile -Datei* und stellen Sie eine Verbindung zum Server her und senden Sie sie, wenn der Server* Wenn Sie alle empfangen, können Sie die Datei löschen, was bedeutet, dass das Senden* abgeschlossen ist. * Implementierungsschritte:* 1: Die logrecFile -Datei muss vorhanden sein* 2: Lesen Sie alle gepaarten Protokolle in eine Sammlung aus* Warten Sie auf das Senden von* 3: Verbindung mit dem Server über Socket herstellen* 4: Ausgabestream erstellen* 5: Senden Sie alle gepaarten Protokolle in Sequenz in der Reihe. "OK", dies bedeutet, dass der Server normal ist * hat alle Protokolle empfangen, und dann kann die LogrecFile * -Datei gelöscht und true zurückgegeben werden, was das Senden abgeschlossen ist. * */ Socket Socket = null; try {// 1 if (! lOGRECFILE.EXISTS ()) {System.out.println (LOGRECFILE+"Nicht existieren!"); false zurückgeben; } // 2 list <string> mines = ioutil.loadlogrec (leiche); // 3 Socket = neuer Socket (ServerHost, Serverport); // 4 Pressewriter PW = neuer Pressewriter (neuer OutputStreamWriter (Socket.GetOutputStream (), "UTF-8"); // 5 für (String -Protokoll: Übereinstimmungen) {pw.println (log); } // 6 pw.println ("Over"); pw.flush (); // 7 BufferedReader BR = New BufferedReader (neuer InputStreamReader (Socket.GetInputStream (), "UTF-8"); // 8 string response = br.readline (); // 9 if ("OK" .Equals (Antwort)) {leicheFile.delete (); zurückkehren; } else {System.out.println ("Protokoll fehlgeschlagen!"); false zurückgeben; }} catch (Ausnahme e) {System.out.println ("Protokoll fehlgeschlagen!"); E. printstacktrace (); } endlich {if (socket! = null) {try {socket.close (); } catch (ioException e) {e.printstacktrace (); }} return false; } /*** Schritt 2: Kombinieren Sie das Protokoll* @return true: Pairing erfolgreich. * Solange Sie einen Typ 8 finden, finden Sie ein Login -Protokoll, das mit * kombiniert werden kann. * * Implementierungsschritte: * 1: notwendiges Urteil * 1.1: Ob logrecfile existiert. Wenn es vorhanden ist, wird es nicht mehr * neue Paararbeiten durchgeführt, um ein Überschreiben zu vermeiden. * 1.2: Die TextLogfile -Datei muss vorhanden sein. * 2: Lesen Sie Textlogfile und lesen Sie die Protokolle und * zur Sammlung. (Mehrere Logdata -Instanzen)* 3: Wenn die Loginlogfile -Datei vorhanden ist, bedeutet* es* Es gibt ein Protokoll, das letztes Mal nicht erfolgreich gepaart wurde, und es wird auch gelesen* und in der Sammlung gespeichert, die darauf wartet, zusammenzuarbeiten Um sich anzumelden und anzumelden * *, wobei der Schlüssel: Benutzer, PID * Wert: logData -Instanz * 4.4: Überqueren Sie die Abmeldung MAP und finden Sie das entsprechende Anmeldeprotokoll in der Anmeldekarte anhand des Schlüssels * jedes Logout -Protokolls und * Speichern Sie das gepaarte Anmeldeprotokoll in der Menge der gepaarten Protokolle. Und löschen Sie das Anmeldeprotokoll im gepaarten Protokoll* aus der Anmeldekarte. Auf diese Weise sollten Sie nur noch keine Paarung übrig haben, wenn Sie sich bei der Karte anmelden. * 5: Schreiben Sie gepaarte Protokolle in logrecFile* 6: Schreiben Sie alle ungepaarten Protokolle in LoginLogfile* 7: Löschen von Textlogfile -Datei* 8: Return True, wobei angezeigt wird, dass die Paarung abgeschlossen ist } //1.2 if (! TextLogfile.exists ()) {System.out.println (TextLogFile+"Nicht existieren!"); false zurückgeben; } // 2 list <logData> list = ioutil.loadLogData (textLogfile); // 3 if (loginlogfile.exists ()) {list.addall (ioutil.loadLogData (loginLogfile)); } // 4 //4.1 list <leiche> masce = new ArrayList <Legrec> (); //4.2 map <string, logData> loginmap = new HashMap <String, logData> (); Karte <string, logData> logoutmap = new HashMap <String, logData> (); //4.3 für (logData logData: list) {string key = logData.getUser ()+ ","+ logData.getPid (); if (logData.gettType () == logData.type_login) {loginmap.put (Schlüssel, logData); } else if (logData.gettType () == logData.type_logout) {logoutmap.put (Schlüssel, logData); }} //4.4 set <Eintrag <String, logData >> Einstieg = logoutmap.EntrySet (); für (Eintrag <String, logData> e: Eintragset) {logData logout = e.getValue (); LogData login = loginmap.remove (e.getKey ()); Logrec logrec = new Logrec (Anmeldung, Abmelden); Matches.Add (logrec); } // 5 ioutil.saveCollection (Übereinstimmungen, logrecFile); // 6 ioutil.saveCollection (loginmap.Values (), LoginLogfile); // 7 textLogfile.delete (); // 8 return true; } catch (Ausnahme e) {System.out.println ("Paarungsprotokoll fehlgeschlagen!"); E. printstacktrace (); } return false; } /*** Schritt 1: Analysieren Sie das Protokoll* @return true: parse erfolgreich* false: analyse fehlgeschlagen und * der erste Schritt wiederholt die Ausführung und führt dazu, dass das vorherige Protokoll überschrieben wird *, Sie müssen hier beurteilen. Wenn Sie das analysierte Protokoll speichern* Die Protokolldatei existiert und der erste Schritt nicht mehr ausgeführt wird. * Diese Protokolldatei wird nach dem zweiten Schritt gelöscht. * 1.2: Die Logfile -Datei muss vorhanden sein (WTMPX -Datei) * 1.3: Gibt es noch ein Protokoll, das analysiert werden kann * 2: Erstellen Sie eine zufällige Accessfile, um die Logfile zu lesen * 3: den Zeiger in die letzte gelesene Position vorbereiten * Starten Sie ein neues Parsing -Werk * 4: Parsingarbeiten * 4.1: Erstellen Sie jedes Listenabschluss. Inhalt in jedem Protokoll (Benutzer, PID, Typ, Zeit, Host) * und speichern Sie es mit einer LogData -Instanz und speichern Sie dann die LogData -Instanz in die Sammlung * 5: Speichern Sie alle Protokolle in der Sammlung in Verhaltenseinheiten in * textLogfile * 6: Speichern Sie die Informationen * 7: TRUE. try {// 1 //1.1 if (textLogfile.exists ()) {return true; } //1.2 if (! Logfile.exists ()) {System.out.println (logfile+"Nicht existieren!"); false zurückgeben; } //1.3 LAUT lastPosition = haslogs (); // piling // system.out.println (// "Lastposition:"+lastposition //); if (lastposition <0) {System.out.println ("Keine Protokolle können analysiert werden!"); false zurückgeben; } // 2 raf = new randomAccessfile (logfile, "r"); // 3 raf.seek (lastposition); // 4 list <logData> list = new ArrayList <LogData> (); für (int i = 0; i <batch; i ++) {// Vor jedem Parsen bestimmen Sie, ob es noch Protokolle gibt, die analysiert werden können, wenn (logfile.length ()-LastPosition <logData.log_Length) {break; } // Benutzer raf.seek analysieren (lastposition+logData.user_offset); String user = ioutil.readstring (raf, logData.user_length) .trim (); // PID raf.seek analysieren (LastPosition+logData.pid_offset); int pid = raf.readint (); // type type raf.seek (lastposition+logData.type_offset); Short type = raf.readshort (); // Zeit analysieren raf.seek (lastposition+logData.time_offset); int time = raf.readint (); // Host Raf.seek einfügen (LastPosition+logData.host_offset); String host = ioutil.readstring (RAF, logData.host_length) .trim (); LogData log = new LogData (Benutzer, PID, Typ, Zeit, Host); list.add (log); // piling // system.out.println (log); // ein Protokoll hochladen, lastPosition lastPosition = raf.getFilepointer () aktualisieren; } // 5 ioutil.saveCollection (Liste, textLogfile); // 6 Speichern Sie die Lesezeichendatei ioutil.savelong (Lastposition, LastPositionFile); // 7 return true; } catch (Ausnahme e) {System.out.println ("Passing -Protokoll fehlgeschlagen!"); E. printstacktrace (); } endlich {if (raf! = null) {try {raf.close (); } catch (ioException e) {e.printstacktrace (); }} return false; } /*** Der erste Schritt besteht darin, einen Link im Protokoll zu analysieren. * Entscheiden Sie nach dem Speicherort des Lesezeichendatei -Datensatzes, ob noch * Protokoll analysiert werden muss. Wenn ja, wird die letzte Position* zurückgegeben. Wenn es nein gibt, geben Sie -1 zurück. * @return */ private long haslogs () {try {/ * * Wenn eine LastPositionFile nicht existiert, bedeutet es *, dass * nie analysiert wurde, sodass Sie von Grund auf analysieren können } Last LastPosition = ioutil.readlong (LastPositionFile); if (logFile.length ()-LastPosition> = logData.log_Length) {return LastPosition; }} catch (Ausnahme e) {e.printstacktrace (); } return -1; } public static void main (string [] args) {try {dmsclient client = new dmsclient (); Client.Start (); } catch (Ausnahme e) {System.out.println ("Client -Lauf fehlgeschlagen!"); }}} 3. Ioutil.java
Paket com.dms; Import Java.io.BufferedReader; Import Java.io.file; Import Java.io.fileinputStream; Import Java.io.inputStreamReader; Import Java.io.ISION.printwriter import Java.io.io.RandomaccessFile; Import Java.util. com.dms.bo.logdata; /** * Diese Klasse ist eine Werkzeugklasse, die für Client -IO -Operationen verantwortlich ist. try {br = new bufferedReader (neuer InputStreamReader (neuer FileInputStream (Datei))); Liste <String> list = new ArrayList <string> (); String line = null; while ((line = br.readline ())! = null) {list.add (line); } Rückgabeliste; } catch (Ausnahme e) {e.printstacktrace (); werfen e; } endlich {if (br! = null) {br.close (); }}} /** * Lesen Sie jedes gepaarte Protokoll aus der angegebenen Datei und speichern Sie sie in * eine Sammlung und kehren Sie dann zurück. * @param Datei * @return * @throws Exception */ public staticliste <logData> loadLogData (Dateidatei) löst eine Ausnahme aus {BufferedReader BR = NULL; try {br = new bufferedReader (neuer InputStreamReader (neuer FileInputStream (Datei))); List <logData> list = new ArrayList <LogData> (); String line = null; while ((line = br.readline ())! list.add (logData); } Rückgabeliste; } catch (Ausnahme e) {e.printstacktrace (); werfen e; } endlich {if (br! = null) {br.close (); }}} / ** * Schreiben Sie den angegebenen langen Wert in die erste Zeile der angegebenen Datei als Zeichenfolge * @param l * @param -Datei * @throws Exception * / public static void Savelong (Long Lon, Datei) löst die Ausnahme aus {printwriter pw = null; try {pw = neuer Pressewriter (Datei); pw.println (lon); } catch (Ausnahme e) {e.printstacktrace (); werfen e; } endlich {if (pw! = null) {pw.close (); }}}} /*** Schreiben Sie die von der toString -Methode jedes Elements in der Sammlung zurückgegebene Zeichenfolge in die angegebene Datei in Verhaltenseinheiten. * @param c * @param Datei * @throws Exception */ public static void SaveCollection (Sammlung C, Datei Datei) löst Ausnahme aus {Printwriter pw = null; try {pw = neuer Pressewriter (Datei); für (Objekt O: c) {pw.println (o); }} catch (Ausnahme e) {e.printstacktrace (); werfen e; } endlich {if (pw! = null) {pw.close (); }}} / ** * Starten Sie kontinuierlich mit der aktuellen Position der gegebenen RandomAccessfile * Lesen Sie Länge Bytes und konvertieren sie in einen String und return * @param raf * @param length * @return * @Throws Ausnahme * / public static StringString (Randomaccessfile RAF, int Länge) Ausnahme {byte [] data = New Byte []. Raf.read (Daten); Neue Zeichenfolge zurückgeben (Daten, "ISO8859-1"); } catch (Ausnahme e) {e.printstacktrace (); werfen e; }} / ** * Lesen Sie die erste Zeile der Zeichenfolge aus der angegebenen Datei und dann * return * @param -Datei * @return * @throws Exception * / public static longlong (Dateidatei) löst eine Ausnahme aus {bufferedReader bR = null; try {br = new bufferedReader (neuer InputStreamReader (neuer FileInputStream (Datei))); String line = br.readline (); return long.parselong (Linie); } catch (Ausnahme e) {e.printstacktrace (); werfen e; } endlich {if (br! = null) {br.close (); }}}}
4. Config.xml
<xml version = "1.0" coding = "utf-8"?> <config> <!-UNIX-Systemprotokolldateiname-> <logfile> wtmpx </logfile> <!-Speichern Sie den Namen der aufgelösten Protokolldateiname-> <textLogfile> log.txt </textLogfile> <! von Einträgen pro Parsed Log-> <Batch> 10 </batch> <!-Paired Protokolldateiname-> <Legrecfile> lOGREC.TXT </loggrecfile> <!-ungepaarter Protokolldateiname-> <LoginGogfile> login.txt </loginlogFile> <! <!-Serveradresse-> <Serverhost> localhost </serverhost> <!-Server-Port-> <versandung> 8088 </Serverport> </config>
5. server-config.xml
<?
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.