ตัวอย่างนี้แบ่งปันรหัสการใช้งานเฉพาะสำหรับการอ่านเข้าสู่ระบบผู้ใช้และเซิร์ฟเวอร์อัพโหลดสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ไคลเอนต์ทำงานบนเซิร์ฟเวอร์ที่ให้บริการ UNIX แก่ผู้ใช้ ใช้ในการอ่านและรวบรวมข้อมูลต้นน้ำและปลายน้ำของผู้ใช้บนเซิร์ฟเวอร์จับคู่และจัดระเบียบแล้วส่งไปยังเซิร์ฟเวอร์เพื่อสรุป
รหัสการใช้งานเฉพาะ:
1. dmsserver.java
แพ็คเกจ com.dms; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputStreamreader; นำเข้า Java.o.utputStreamwriter; นำเข้า Java.io.printwriter; java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า java.util.concurrent.blockingqueue; นำเข้า Java.util.concurrent.executorservice; นำเข้า Java.Util.Current นำเข้า org.dom4j.document; นำเข้า org.dom4j.element; นำเข้า org.dom4j.io.saxreader; /** * เซิร์ฟเวอร์ DMS ใช้เพื่อรับ * บันทึกการจับคู่ที่ส่งโดยลูกค้าแต่ละรายและบันทึกไว้ในไฟล์ท้องถิ่น * @author Administrator * */คลาสสาธารณะ DMSServer {// คำจำกัดความคุณสมบัติ // เซิร์ฟเวอร์เซิร์ฟเวอร์เซิร์ฟเวอร์ส่วนตัวเซิร์ฟเวอร์ที่ใช้เพื่อรับเซิร์ฟเวอร์ที่เชื่อมต่อกับไคลเอนต์; // เธรดพูลที่ใช้ในการจัดการเธรดที่จัดการคำขอไคลเอนต์ ExecutorService Private ExecutorService ThreadPool; // บันทึกไฟล์ทั้งหมดที่ส่งโดยไคลเอนต์เพื่อจับคู่บันทึกส่วนตัวไฟล์ ServerLogFile; // ข้อความคิวส่วนตัวการปิดกั้นส่วนใหญ่ <string> messageQueue = ใหม่ linkedBlockingQueue <String> (); DMSServer สาธารณะ () โยนข้อยกเว้น {ลอง {System.out.println ("เซิร์ฟเวอร์กำลังเริ่มต้น ... "); // 1 วิเคราะห์การกำหนดค่าไฟล์เซิร์ฟเวอร์ config.xml <String, String> config = loadConfig (); // 2 เริ่มต้นแอตทริบิวต์ init (config); System.out.println ("การเริ่มต้นเซิร์ฟเวอร์เสร็จสมบูรณ์ ... "); } catch (exception e) {system.out.println ("การเริ่มต้นล้มเหลว!"); โยน e; }} / *** ขั้นตอนแรกในการเริ่มต้นเมธอดคอนสตรัคเตอร์คือการแยกวิเคราะห์ไฟล์การกำหนดค่า* @return แผนที่ที่ส่งคืนจะถูกบันทึกไว้ในแต่ละรายการของไฟล์การกำหนดค่าที่คีย์: ชื่อของแท็ก* ค่าคือข้อความที่อยู่ตรงกลางของแท็ก* @throws เอกสารเอกสาร = reader.Read (ไฟล์ใหม่ ("Server-config.xml"))); Element root = doc.getRootelement (); แผนที่ <สตริงสตริง> config = new hashmap <string, string> (); /** รับแท็กย่อยทั้งหมดในแท็ก <config>* และบันทึกชื่อของแต่ละแท็กย่อยเป็นคีย์และข้อความ* ที่อยู่ตรงกลางคือค่าในการรวบรวมแผนที่*/ list <องค์ประกอบ> list = root.elements (); สำหรับ (องค์ประกอบ e: รายการ) {คีย์สตริง = e.getName (); ค่าสตริง = e.getTextTrim (); config.put (คีย์, ค่า); } return config; } catch (exception e) {system.out.println ("แก้ไขข้อยกเว้นไฟล์การกำหนดค่า!"); E.PrintStackTrace (); โยน e; }} /** * ขั้นตอนที่สองของการเริ่มต้นวิธีการสร้างคือการเริ่มต้นแอตทริบิวต์ตามรายการการกำหนดค่า * @param config * @throws exception * /โมฆะส่วนตัวเริ่มต้น (แผนที่ <สตริงสตริง> config) โยนข้อยกเว้น { / * * เริ่มต้นแอตทริบิวต์ สร้าง. ค่านี้ใช้เป็นจำนวนเธรดเธรดพูล* เริ่มต้นคุณสมบัติด้วย <serverport> ในไฟล์การกำหนดค่า: เซิร์ฟเวอร์ที่นี่ค่านี้เป็นพอร์ตเซิร์ฟเวอร์ของเซิร์ฟเวอร์เซิร์ฟเวอร์*/ this.server = ใหม่ Serversocket (integer.parseint (config.get ("Serverport")))) this.serverLogFile = ไฟล์ใหม่ (config.get ("logrecfile")); this.threadpool = executors.newfixedthreadpool (integer.parseint (config.get ("threadsum"))); } /** * วิธีการเริ่มทำงานบนเซิร์ฟเวอร์ * @throws Exception * /Public Void Start () โยนข้อยกเว้น { / * * ข้อกำหนดการใช้งาน: * ก่อนอื่นเริ่มเธรดแยกต่างหากเพื่อเรียกใช้ saveloghandler * งานนี้คือการบันทึกบันทึกการจับคู่ทั้งหมด * จากนั้นเริ่มฟังพอร์ตเซิร์ฟเวอร์ เมื่อไคลเอนต์เชื่อมต่อแล้ว * สร้างอินสแตนซ์ไคลเอนต์ฮันเดอร์แล้วส่งมอบงานให้กับพูลเธรด * เพื่อกำหนดเธรดเพื่อจัดการการโต้ตอบกับไคลเอนต์ * */ ลอง {system.out.println ("เซิร์ฟเวอร์เริ่มทำงาน ... "); Saveloghandler SLH = ใหม่ saveloghandler (); เธรดใหม่ (slh). start (); ในขณะที่ (จริง) {ซ็อกเก็ตซ็อกเก็ต = server.accept (); threadpool.execute (ใหม่ clienthandler (ซ็อกเก็ต)); }} catch (exception e) {e.printstacktrace (); โยน e; }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {dmsserver server = new dmsserver (); Server.start (); } catch (exception e) {system.out.println ("สถานีไม่สามารถเริ่มต้นเซิร์ฟเวอร์!"); }}} / ** * เธรดนี้รับผิดชอบในการดึงบันทึกคู่จับคู่จากคิวข้อความ * และบันทึกลงในไฟล์ ServerLogFile * @author Administrator * * / คลาสส่วนตัว saveloghandler ใช้งาน {public void run () {printwriter pw = null; ลอง {PW = ใหม่ PrintWriter (ใหม่ FileOutputStream (ServerLogFile, True)); ในขณะที่ (จริง) {ถ้า (messagequeue.size ()> 0) {pw.println (messagequeue.poll ()); } else {pw.flush (); Thread.sleep (500); }}} catch (exception e) {e.printstacktrace (); } ในที่สุด {ถ้า (pw! = null) {pw.close (); }}}}} / ** * จัดการคำขอไคลเอ็นต์ที่ระบุ * @author Administrator * * / คลาสส่วนตัวไคลเอนต์ Handler ดำเนินการ runnable {ซ็อกเก็ตส่วนตัวซ็อกเก็ต; Public ClientHandler (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต; } public void run () { / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * แอร์บิวท์ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * สตริง "over" ถ้าไม่เป็นบันทึกจับคู่และบันทึกลงในไฟล์ท้องถิ่น ถ้าเป็นเช่นนั้น * หยุดอ่าน * 4: ตอบกลับลูกค้า "ตกลง" หลังจากอ่านบันทึกทั้งหมด */ PrintWriter PW = NULL สำเร็จ; ลอง {// 1 pw = ใหม่ printwriter (ใหม่ outputStreamWriter (socket.getOutputStream (), "UTF-8")); // 2 bufferedReader br = bufferedreader ใหม่ (ใหม่ inputStreamReader (socket.getInputStream (), "UTF-8")); // 3 ข้อความสตริง = null; ในขณะที่ ((message = br.readline ())! = null) {ถ้า ("over" .equals (ข้อความ)) {break; } // เขียนบันทึกไปยังไฟล์เพื่อบันทึก messageQueue.offer (ข้อความ); } // 4 pw.println ("ตกลง"); pw.flush (); } catch (exception e) {e.printstacktrace (); pw.println ("ข้อผิดพลาด"); pw.flush (); } ในที่สุด {ลอง {// ตัดการเชื่อมต่อจากไคลเอนต์เพื่อปล่อยซ็อกเก็ตทรัพยากร close (); } catch (ioexception e) {e.printstacktrace (); - 2. dmsclient.java
แพ็คเกจ com.dms; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า java.io.InputStreamReader; นำเข้า java.io.OutputStreamWriter; นำเข้า java.io.printwriter; java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า java.util.map.entry; นำเข้า java.util.set; นำเข้า org.dom4j.document; นำเข้า org.dom4j.element; นำเข้า org.dom4j.io.saxreader; นำเข้า com.dms.bo.logdata; นำเข้า com.dms.bo.logrec; /*** ไคลเอนต์นี้ทำงานบนเซิร์ฟเวอร์ที่ให้บริการ UNIX แก่ผู้ใช้ * ใช้ในการอ่านและรวบรวมข้อมูลต้นน้ำและปลายน้ำของผู้ใช้บนเซิร์ฟเวอร์และ * จับคู่และเรียงลำดับและส่งไปยังเซิร์ฟเวอร์เพื่อสรุป * @author Administrator * */คลาสสาธารณะ DMSClient {// คำจำกัดความของแอตทริบิวต์ // ขั้นตอนที่ 1: แยกวิเคราะห์คุณสมบัติที่ต้องการของบันทึก // UNIX ระบบบันทึกไฟล์บันทึกไฟล์ส่วนตัว; // บันทึกไฟล์ของไฟล์บันทึกส่วนตัวที่แยกวิเคราะห์ไฟล์ textlogfile; // bookmark ไฟล์ไฟล์ส่วนตัว LastPositionFile; // จำนวนรายการสำหรับการแยกวิเคราะห์แต่ละรายการในชุดส่วนตัว // ขั้นตอนที่ 2: จับคู่แอตทริบิวต์ของ log // บันทึกไฟล์ logrecfile ไฟล์ส่วนตัว; // บันทึกไฟล์ส่วนตัวไฟล์ loginLogfile; // ขั้นตอนที่ 3: แยกวิเคราะห์แอตทริบิวต์ของ log // ที่อยู่เซิร์ฟเวอร์ที่อยู่ส่วนตัวสตริงเซิร์ฟเวอร์โฮสต์; // พอร์ตเซิร์ฟเวอร์ Serverport Private Int; /*** เมธอด constructor ใช้ในการเริ่มต้นไคลเอนต์* @throws Exception*/public dmsClient () พ่นข้อยกเว้น {ลอง {// 1 แยกวิเคราะห์ไฟล์กำหนดค่า config.xml แผนที่ <สตริงสตริง> config = loadConfig (); // piling system.out.println (config); // 2 เริ่มต้นแอตทริบิวต์ init (config); } catch (exception e) {system.out.println ("การเริ่มต้นล้มเหลว!"); โยน e; }} / ** * เริ่มต้นขั้นตอนที่สองของเมธอดคอนสตรัคเตอร์เริ่มต้นแอตทริบิวต์ตามรายการการกำหนดค่า * @param config * @throws exception * / โมฆะส่วนตัวเริ่มต้น (แผนที่ <สตริงสตริง> config) โยนข้อยกเว้น {ลอง {logfile = ไฟล์ใหม่ (config.get ("logfile"); textlogfile = ไฟล์ใหม่ (config.get ("textlogfile")); lastPositionFile = ไฟล์ใหม่ (config.get ("lastPositionFile")); batch = integer.parseint (config.get ("batch")); logrecfile = ไฟล์ใหม่ (config.get ("logrecfile")); loginLogFile = ไฟล์ใหม่ (config.get ("loginLogFile")); ServerHost = config.get ("ServerHost"); serverport = integer.parseint (config.get ("serverport")); } catch (exception e) {system.out.println ("คุณสมบัติการเริ่มต้นล้มเหลว!"); E.PrintStackTrace (); โยน e; }} / ** * ขั้นตอนแรกในการเริ่มต้นของวิธีการสร้างคือการแยกวิเคราะห์ไฟล์การกำหนดค่า * @return แผนที่ที่ส่งคืนจะถูกบันทึกไว้ในแต่ละรายการของไฟล์การกำหนดค่าโดยที่คีย์: ชื่อของแท็ก * ค่าคือข้อความที่อยู่ตรงกลางของแท็ก * @throws เอกสารเอกสาร = reader.read (ไฟล์ใหม่ ("config.xml")); Element root = doc.getRootelement (); แผนที่ <สตริงสตริง> config = new hashmap <string, string> (); /** รับแท็กย่อยทั้งหมดในแท็ก <config>* และใช้ชื่อของแต่ละแท็กย่อยเป็นคีย์* ในข้อความกลางจะถูกเก็บไว้ในคอลเลกชันแผนที่เป็นค่า*/ รายการ <องค์ประกอบ> list = root.elements (); สำหรับ (องค์ประกอบ e: รายการ) {คีย์สตริง = e.getName (); ค่าสตริง = e.getTextTrim (); config.put (คีย์, ค่า); } return config; } catch (exception e) {system.out.println ("ข้อยกเว้นไฟล์การกำหนดค่าแยกวิเคราะห์!"); E.PrintStackTrace (); โยน e; }} / *** วิธีการให้ไคลเอนต์เริ่มทำงาน* สามขั้นตอนของลูป:* 1: การแยกวิเคราะห์บันทึก* 2: การจับคู่บันทึก* 3: ส่งบันทึก* / โมฆะสาธารณะเริ่มต้น () {parselogs (); matchlogs (); sendlogs (); // ในขณะที่ (จริง) {// // // parse log // if (! parselogs ()) {// ดำเนินการต่อ; //} // // บันทึกการจับคู่ /// ถ้า (! matchlogs ()) {// ต่อ; //} // // ส่งบันทึก ล้มเหลว* / บูลีนส่วนตัว sendlogs () { /** แนวคิดการใช้งาน:* อ่านบันทึกที่จับคู่ทั้งหมดในไฟล์ logrecfile* และเชื่อมต่อกับเซิร์ฟเวอร์และส่งไปถ้าเซิร์ฟเวอร์* หากคุณได้รับทั้งหมดคุณสามารถลบไฟล์ซึ่งหมายความว่าการส่ง* เสร็จสมบูรณ์ * ขั้นตอนการใช้งาน:* 1: ไฟล์ logrecfile ต้องมีอยู่* 2: อ่านออกและเก็บบันทึกจับคู่ทั้งหมดลงในคอลเลกชัน* รอการส่ง* 3: เชื่อมต่อกับเซิร์ฟเวอร์ผ่านซ็อกเก็ต* 4: สร้างกระแสเอาต์พุต* 5: ส่งบันทึกคู่ทั้งหมดไปยังเซิร์ฟเวอร์ "ตกลง" หมายความว่าเซิร์ฟเวอร์เป็นเรื่องปกติ * ได้รับบันทึกทั้งหมดจากนั้นไฟล์ LogrecFile * สามารถลบและส่งคืนจริงได้หมายความว่าการส่งเสร็จสิ้น * */ ซ็อกเก็ตซ็อกเก็ต = null; ลอง {// 1 ถ้า (! logrecfile.exists ()) {system.out.println (logrecfile+"ไม่มีอยู่!"); กลับเท็จ; } // 2 รายการ <string> matches = ioutil.loadlogrec (logrecfile); // 3 ซ็อกเก็ต = ซ็อกเก็ตใหม่ (ServerHost, Serverport); // 4 PrintWriter PW = ใหม่ PrintWriter (ใหม่ OutputStreamWriter (Socket.GetOutputStream (), "UTF-8")); // 5 สำหรับ (บันทึกสตริง: ตรงกัน) {pw.println (บันทึก); } // 6 pw.println ("over"); pw.flush (); // 7 bufferedReader br = bufferedreader ใหม่ (ใหม่ inputStreamReader (socket.getInputStream (), "UTF-8")); // 8 การตอบสนองสตริง = br.readline (); // 9 ถ้า ("ตกลง" .Equals (การตอบสนอง)) {logrecfile.delete (); กลับมาจริง; } else {system.out.println ("ส่งบันทึกล้มเหลว!"); กลับเท็จ; }} catch (exception e) {system.out.println ("ส่งบันทึกล้มเหลว!"); E.PrintStackTrace (); } ในที่สุด {ถ้า (ซ็อกเก็ต! = null) {ลอง {socket.close (); } catch (ioexception e) {e.printstacktrace (); }} return false; } /*** ขั้นตอนที่ 2: จับคู่บันทึก* @return จริง: การจับคู่ประสบความสำเร็จ* เท็จ: การจับคู่ล้มเหลว* /บูลีนส่วนตัว matchlogs () { /** แนวคิดการใช้งาน:* อ่านบันทึกใหม่ทั้งหมดที่แยกวิเคราะห์ในขั้นตอนแรกด้วยบันทึกการเข้าสู่ระบบ * ตราบใดที่คุณสามารถหาประเภท 8 คุณสามารถค้นหาบันทึกการเข้าสู่ระบบที่สามารถจับคู่กับ * * * ขั้นตอนการใช้งาน: * 1: การตัดสินที่จำเป็น * 1.1: Logrecfile มีอยู่หรือไม่ หากมีอยู่มันจะไม่เป็นงานจับคู่ใหม่อีกต่อไปจะดำเนินการเพื่อหลีกเลี่ยงการเขียนทับ * 1.2: ต้องมีไฟล์ textlogfile * 2: อ่าน textlogfile และอ่านบันทึกและ * ไปยังคอลเลกชัน (อินสแตนซ์ logdata หลายอินสแตนซ์)* 3: หากไฟล์ loginLogfile มีอยู่หมายความว่า* มีบันทึกที่ไม่ได้จับคู่กันสำเร็จในครั้งที่แล้วและมันก็อ่าน* และบันทึกไว้ในคอลเลกชันที่รอการจับคู่เข้าด้วยกัน* 4: การจับคู่* 4.1: สร้างคอลเลกชัน ในการเข้าสู่ระบบและออกจากระบบ * * โดยที่คีย์: ผู้ใช้, pid * value: logdata อินสแตนซ์ * 4.4: สำรวจแผนที่ออกจากระบบและค้นหาบันทึกการเข้าสู่ระบบที่สอดคล้องกันในแผนที่เข้าสู่ระบบตามคีย์ * ของแต่ละล็อกออฟล็อกอินและ * บันทึกการบันทึกคู่ในชุดบันทึกจับคู่ และลบบันทึกการเข้าสู่ระบบในบันทึกจับคู่* จากแผนที่เข้าสู่ระบบ ด้วยวิธีนี้ ** คุณไม่ควรมีการจับคู่ที่เหลือเมื่อคุณเข้าสู่แผนที่ * 5: เขียนบันทึกจับคู่ไปยัง logrecfile* 6: เขียนบันทึกที่ไม่มีคู่ทั้งหมดไปยัง loginLogfile* 7: ลบไฟล์ textlogfile* 8: ส่งคืนจริงแสดงว่าการจับคู่เสร็จสิ้น**/ลอง {// 1 //1.1 ถ้า (logrecfile.exists () } //1.2 if (! textlogfile.exists ()) {system.out.println (textlogfile+"ไม่มีอยู่!"); กลับเท็จ; } // 2 รายการ <logdata> list = ioutil.loadlogdata (textlogfile); // 3 ถ้า (loginLogfile.exists ()) {list.addall (ioutil.loadlogdata (loginLogfile)); } // 4 //4.1 รายการ <Logrec> matches = new ArrayList <Logrec> (); //4.2 แผนที่ <สตริง, logdata> loginMap = new hashmap <string, logdata> (); แผนที่ <string, logdata> logoutmap = new hashmap <string, logdata> (); //4.3 สำหรับ (logdata logdata: list) {string key = logdata.getUser ()+ ","+ logdata.getPid (); if (logdata.getType () == logdata.type_login) {loginmap.put (คีย์, logdata); } อื่นถ้า (logdata.getType () == logdata.type_logout) {logoutmap.put (คีย์, logdata); }} //4.4 set <entry <string, logdata >> entryset = logoutmap.entryset (); สำหรับ (รายการ <string, logdata> e: entryset) {logdata logout = e.getValue (); logdata login = loginmap.remove (e.getKey ()); logrec logrec = ใหม่ logrec (เข้าสู่ระบบ, ออกจากระบบ); matches.add (logrec); } // 5 ioutil.saveCollection (จับคู่, logrecfile); // 6 ioutil.saveCollection (loginmap.values (), loginLogfile); // 7 textlogfile.delete (); // 8 return true; } catch (exception e) {system.out.println ("บันทึกการจับคู่ล้มเหลว!"); E.PrintStackTrace (); } return false; } /*** ขั้นตอนที่ 1: แยกวิเคราะห์บันทึก* @return จริง: แยกวิเคราะห์ประสบความสำเร็จ* เท็จ: การแยกวิเคราะห์ล้มเหลว* /บูลีนส่วนตัว parselogs () { /** แนวคิดการใช้งาน:* ลูปอ่านบันทึกแบทช์จากนั้นจึงแยกข้อมูล* 5 ในแต่ละบันทึก ยังถูกใช้และ * ขั้นตอนแรกซ้ำการดำเนินการทำให้บันทึกก่อนหน้านี้ถูกเขียนทับ * คุณต้องตัดสินที่นี่ หากคุณบันทึกบันทึกที่แยกวิเคราะห์* ไฟล์บันทึกมีอยู่และขั้นตอนแรกจะไม่ถูกเรียกใช้อีกต่อไป * ไฟล์บันทึกนี้จะถูกลบหลังจากจับคู่ขั้นตอนที่สอง * 1.2: ไฟล์ logfile ต้องมีอยู่ (ไฟล์ wtmpx) * 1.3: ยังมีบันทึกที่สามารถแยกวิเคราะห์ได้ * 2: สร้างแบบสุ่มไฟล์เพื่ออ่าน logfile * 3: ย้ายตัวชี้ไปยังตำแหน่งการอ่านสุดท้าย ในแต่ละบันทึก (ผู้ใช้, PID, ประเภท, เวลา, โฮสต์) * และบันทึกด้วยอินสแตนซ์ logdata จากนั้นบันทึก * อินสแตนซ์ logdata ลงในคอลเลกชัน * 5: บันทึกบันทึกทั้งหมดในคอลเลกชันในหน่วยพฤติกรรมเป็น * textlogfile * 6: บันทึกข้อมูลบุ๊คมาร์ค * 7: ส่งคืนจริง ลอง {// 1 //1.1 ถ้า (textlogfile.exists ()) {return true; } //1.2 if (! logfile.exists ()) {system.out.println (logfile+"ไม่มีอยู่!"); กลับเท็จ; } //1.3 Long LastPosition = Haslogs (); // piling // system.out.println (// "lastposition:"+lastposition //); if (lastposition <0) {system.out.println ("ไม่สามารถแยกวิเคราะห์บันทึกได้!"); กลับเท็จ; } // 2 raf = new randomaccessFile (logfile, "r"); // 3 raf.seek (lastposition); // 4 รายการ <logdata> list = new ArrayList <LogData> (); สำหรับ (int i = 0; i <batch; i ++) {// ก่อนการแยกวิเคราะห์แต่ละครั้งตรวจสอบว่ายังมีบันทึกที่สามารถแยกวิเคราะห์ได้หรือไม่ถ้า (logfile.length ()-lastposition <logdata.log_length) {break; } // การแยกวิเคราะห์ผู้ใช้ raf.seek (lastposition+logdata.user_offset); string user = ioutil.readString (raf, logdata.user_length) .trim (); // Parse PID Raf.seek (LastPosition+logdata.pid_offset); int pid = raf.readint (); // ประเภทการแยกวิเคราะห์ raf.seek (lastposition+logdata.type_offset); ประเภทสั้น = raf.readshort (); // การแยกวิเคราะห์เวลา raf.seek (lastposition+logdata.time_offset); เวลา int = raf.readint (); // วางโฮสต์ raf.seek (lastposition+logdata.host_offset); สตริงโฮสต์ = ioutil.readString (raf, logdata.host_length) .trim (); logdata log = new logdata (ผู้ใช้, PID, ประเภท, เวลา, โฮสต์); list.add (บันทึก); // piling // system.out.println (บันทึก); // อัปโหลดบันทึกอัปเดต LastPosition LastPosition = raf.getFilePointer (); } // 5 ioutil.saveCollection (รายการ, textlogfile); // 6 บันทึกไฟล์บุ๊กมาร์ก ioutil.savelong (LastPosition, LastPositionFile); // 7 return true; } catch (exception e) {system.out.println ("บันทึกผ่านล้มเหลว!"); E.PrintStackTrace (); } ในที่สุด {ถ้า (raf! = null) {ลอง {raf.close (); } catch (ioexception e) {e.printstacktrace (); }} return false; } /*** ขั้นตอนแรกคือการแยกวิเคราะห์ลิงก์ในบันทึก * ตามที่ตั้งของบันทึกไฟล์บุ๊กมาร์กให้พิจารณาว่ายังมีบันทึก * เพื่อแยกวิเคราะห์หรือไม่ หากมีตำแหน่งสุดท้าย* จะถูกส่งคืน หากไม่มีให้กลับมา -1 * @return */ Private Long Haslogs () {ลอง {/ * * หากไม่มี LastPositionFile อยู่หมายความว่า * ไม่เคยแยกวิเคราะห์ดังนั้นคุณสามารถแยกวิเคราะห์ได้ตั้งแต่เริ่มต้น */ ถ้า (! } Long LastPosition = ioutil.readLong (lastPositionFile); if (logfile.length ()-lastPosition> = logdata.log_length) {return lastposition; }} catch (exception e) {e.printstacktrace (); } return -1; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {dmsclient client = new dmsClient (); client.start (); } catch (exception e) {system.out.println ("ไคลเอนต์รันล้มเหลว!"); - 3. ioutil.java
แพ็คเกจ com.dms; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.fileinputstream นำเข้า java.io.inputstreamreader; นำเข้า java.io.printwriter; นำเข้า java.io.randomaccessfile นำเข้า Java.util.Arraylist; com.dms.bo.logdata; /** * คลาสนี้เป็นคลาสเครื่องมือที่รับผิดชอบการดำเนินการ iO ของลูกค้า * @author Administrator * */คลาสสาธารณะ ioutil {/** * อ่านแต่ละบรรทัดของสตริงจากไฟล์ที่กำหนด (บันทึกจับคู่) * และบันทึกคอลเลกชันเพื่อส่งคืนไฟล์ * @param ลอง {br = ใหม่ bufferedReader (ใหม่ inputStreamReader (ใหม่ fileInputStream (ไฟล์))); รายการ <string> list = new ArrayList <String> (); สตริงบรรทัด = null; ในขณะที่ ((line = br.readline ())! = null) {list.add (บรรทัด); } return list; } catch (exception e) {e.printstacktrace (); โยน e; } ในที่สุด {ถ้า (br! = null) {br.close (); }}} /** * อ่านบันทึกคู่แต่ละรายการจากไฟล์ที่กำหนดและบันทึกลงใน * A Collection แล้วกลับมา * ไฟล์ @param * @return * @Throws Exception */ รายการคงที่สาธารณะ <LogData> loadlogData (ไฟล์ไฟล์) โยนข้อยกเว้น {bufferedReader br = null; ลอง {br = ใหม่ bufferedReader (ใหม่ inputStreamReader (ใหม่ fileInputStream (ไฟล์))); รายการ <logdata> list = new ArrayList <LogData> (); สตริงบรรทัด = null; ในขณะที่ ((line = br.readline ())! = null) {logdata logdata = ใหม่ logdata (บรรทัด); list.add (logdata); } return list; } catch (exception e) {e.printstacktrace (); โยน e; } ในที่สุด {ถ้า (br! = null) {br.close (); }}} / ** * เขียนค่ายาวที่ระบุลงในบรรทัดแรกของไฟล์ที่กำหนดเป็นสตริง * @param l * @param file * @throws Exception * / โมฆะสาธารณะคงที่ savelong (Long Lon, ไฟล์ไฟล์) ลอง {pw = ใหม่ printwriter (ไฟล์); Pw.println (LON); } catch (exception e) {e.printstacktrace (); โยน e; } ในที่สุด {ถ้า (pw! = null) {pw.close (); }}}} /*** เขียนสตริงที่ส่งคืนโดยวิธี toString ของแต่ละองค์ประกอบในการรวบรวมไปยังไฟล์ที่ระบุในหน่วยพฤติกรรม * @param c * @param file * @throws Exception */ โมฆะสาธารณะคงที่ SaveCollection (คอลเลกชัน C ไฟล์ไฟล์) พ่นข้อยกเว้น {printWriter pw = null; ลอง {pw = ใหม่ printwriter (ไฟล์); สำหรับ (วัตถุ o: c) {pw.println (o); }} catch (exception e) {e.printstacktrace (); โยน e; } ในที่สุด {ถ้า (pw! = null) {pw.close (); }}} / ** * เริ่มอย่างต่อเนื่องจากตำแหน่งปัจจุบันของแบบสุ่มที่กำหนด * อ่านความยาวไบต์และแปลงเป็นสตริงและส่งคืน * @param raf * @param ความยาว * @return * @throws Exception * / สตริงคงที่ raf.read (ข้อมูล); ส่งคืนสตริงใหม่ (ข้อมูล "ISO8859-1"); } catch (exception e) {e.printstacktrace (); โยน e; }} / ** * อ่านบรรทัดแรกของสตริงจากไฟล์ที่กำหนดจากนั้น * return * @param ไฟล์ * @return * @throws Exception * / Public Static Long Readlong (ไฟล์ไฟล์) โยนข้อยกเว้น {bufferedreader br = null; ลอง {br = ใหม่ bufferedReader (ใหม่ inputStreamReader (ใหม่ fileInputStream (ไฟล์))); สตริงบรรทัด = br.readline (); return long.parselong (บรรทัด); } catch (exception e) {e.printstacktrace (); โยน e; } ในที่สุด {ถ้า (br! = null) {br.close (); -
4. config.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <config> <!-ชื่อไฟล์บันทึกระบบ Unix-> <logfile> wtmpx </logfile> <!-บันทึกชื่อไฟล์บันทึกที่แก้ไขแล้ว-> <textlogfile> log.txt </textlogfile> ของรายการต่อบันทึกที่แยกวิเคราะห์-> <batch> 10 </batch> <!-ชื่อไฟล์บันทึกที่จับคู่-> <logrecfile> logrec.txt </logrecfile> <!-ชื่อไฟล์บันทึกที่ไม่ได้จับคู่-> <loginLogfile> loginlogfile </loginlogfile> <!-ที่อยู่เซิร์ฟเวอร์-> <serverhost> localhost </serverhost> <!-พอร์ตเซิร์ฟเวอร์-> <serverport> 8088 </serverport> </config>
5. Server-config.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <config> <!-ชื่อไฟล์ของเซิร์ฟเวอร์ที่บันทึกไฟล์บันทึกที่จับคู่-> <logrecfile> เซิร์ฟเวอร์-logs.txt </logrecfile> <!
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน