В этом примере используется конкретный код реализации для чтения входа в систему пользователя и загрузки сервера для вашей ссылки. Конкретный контент заключается в следующем
Клиент работает на сервере, который предоставляет пользователю службы Unix. Используется для чтения и сбора всплывающей и нижней информации пользователей на сервере, соединить и организовать их, а затем отправьте их на сервер для краткого изложения.
Конкретный код реализации:
1. DMSServer.java
пакет com.dms; Импорт java.io.bufferedReader; импорт java.io.file; импорт java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.inputStreamRead; импорт java.io.outputStreamwriter; импорт java.io.printwriter; import java.netsocke; java.util.hashmap; import java.util.list; import java.util.map; import java.util.concurrent.blockqueue; import java.util.concurrent.executorservice; import.Util.Concurrent.Executors; import java.util.concurrent.linked.concurrent.executors; import java.util.concurrent.linked.linked.linked.linked.linked.linked.linked.linked.linked.linked.linked.col Импорт org.dom4j.document; импорт org.dom4j.element; импорт org.dom4j.io.saxreader; /** * DMS -сервер, используемый для получения * журналов спаривания, отправленных каждым клиентом, и сохранить их в локальном файле * @Author Administrator * */Public Class DMSServer {// Определение свойства // Serversocket Private Serversocket Server, используемый для получения сервера, подключенного к клиенту; // Пул потоков, используемый для управления потоками, которые обрабатывают запросы клиентов Private ExecutorService Threadpool; // Сохранить все файлы, отправляемые клиентами, чтобы соединить журналы private file serverlogfile; // очередь сообщений частная блокировка public dmsserver () Throws Exception {try {System.out.println («Сервер инициализация ...»); // 1 Разбор файлов конфигурации сервер-config.xml map <string, string> config = loadconfig (); // 2 Инициализировать атрибут init (config); System.out.println ("инициализация сервера завершена ..."); } catch (Exception e) {System.out.println ("Инициализация не удалась!"); бросить E; } } /** * The first step in initializing the constructor method is to parse the configuration file* @return The returned Map is saved in each item of the configuration file, where key: the name of the tag, * value is the text in the middle of the tag* @throws Exception */ private Map<String,String> loadConfig() throws Exception{ try { SAXReader reader = new SAXReader(); Документ doc = reader.read (новый файл ("server-config.xml")); Элемент root = doc.getRootelement (); Map <string, string> config = new hashmap <string, string> (); /** Получить все подборы в теге <config>* и сохраните имя каждой подразделения в качестве ключа, а* текст в середине является значением в коллекции карт*/ list <element> list = root.elements (); for (element e: list) {string key = e.getName (); String value = e.getTextTrim (); config.put (ключ, значение); } return config; } catch (Exception e) {System.out.println ("Разрешение файла конфигурации!"); e.printstacktrace (); бросить E; }} /** * Второй шаг для инициализации метода конструктора состоит в том, чтобы инициализация атрибута в соответствии с элементом конфигурации * @param config * @Throws Exception * /private void init (map <строка, строка> конфигурация). созданный. Это значение используется в качестве количества потоков пула потоков* Инициализировать свойство с помощью <sererport> В файле конфигурации: сервер, здесь это значение является портом сервера Serversocket*/ this.server = new Serversocket (integer.parseint (config.get ("serverport")))); this.serverlogfile = new File (config.get ("logrecfile")); this.threadpool = executors.newfixedthreadpool (integer.parseint (config.get ("threadsum"))); } /** * Метод для начала работы на сервере * @Throws Exception * /public void start () Throws Exception { / * * Требования к реализации: * сначала запустите поток отдельно, чтобы запустить SavelogHandler * Эта задача состоит в том, чтобы сохранить все журналы спаривания *, а затем начать прослушивание цикла портов сервера. Как только клиент подключен, * создайте экземпляр клиента, а затем передайте задачу пулу потоков *, чтобы назначить потоки для обработки взаимодействия с клиентом. * */ try {System.out.println («Сервер начинает работать ...»); Saveloghandler slh = new Saveloghandler (); новая потока (slh) .start (); while (true) {socket socket = server.accept (); threadpool.execute (новый клиент -handler (сокет)); }} catch (Exception e) {e.printstackTrace (); бросить E; }} public static void main (string [] args) {try {dmsserver server = new dmsserver (); Server.Start (); } catch (Exception e) {System.out.println ("Станция не удалось запустить сервер!"); }}} / ** * Этот поток отвечает за извлечение каждого парного журнала из очереди сообщений, * и сохранение в файле Serverlogfile * @author Administrator * * / Private Class SavelogHandler реализует runnable {public void run () {printWriter pw = null; try {pw = new PrintWriter (new FileOutputStream (Serverlogfile, true)); while (true) {if (messagequeue.size ()> 0) {pw.println (messagequeue.poll ()); } else {pw.flush (); Thread.sleep (500); }}} catch (Exception e) {e.printstackTrace (); } наконец {if (pw! = null) {pw.close (); }}}}} / ** * обрабатывать указанный клиент -запрос * @author Administrator * * / Private Class ClientHandler реализует runnable {private Socket Socket; public clientHandler (сокет сокета) {this.socket = ocket; } public void run () { / * * Идея: * сначала получайте все парные журналы, отправленные клиентом, * до «Over», затем сохраните эти парные * журналы в локальный файл, и ответьте на клиент * "OK" * Выполнить шаги: * 1: Создайте выходной поток через сокет, чтобы отправить ответ на клиент * 2: Создать входной поток, и прочтите лога Строка "Over". Если нет, то это спарный журнал, и сохраните его в локальном файле. Если так, * прекратить читать. * 4: Ответьте клиенту «ОК» после успешного чтения всех журналов */ printwriter pw = null; try {// 1 pw = new PrintWriter (новый outputStreamWriter (socket.getOutputStream (), "UTF-8")); // 2 BufferedReader BR = New BufferedReader (New InputStreamReader (socket.getInputStream (), "UTF-8")); // 3 String Message = null; while ((message = br.readline ())! = null) {if ("over" .equals (message)) {break; } // Записать журнал в файл для сохранения messagequeue.offer (message); } // 4 pw.println ("ok"); pw.flush (); } catch (Exception e) {e.printstackTrace (); pw.println ("ошибка"); pw.flush (); } наконец {try {// отключить от клиента, чтобы выпустить ресурс socket.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.io.randomaccessfile; import java.net.socket; java.util.hashmap; import java.util.list; import java.util.map; import java.util.map.entry; import java.util.set; Импорт org.dom4j.document; импорт org.dom4j.element; импорт org.dom4j.io.saxreader; Импорт com.dms.bo.logdata; импорт com.dms.bo.logrec; /*** Этот клиент работает на сервере, который предоставляет пользователям службы Unix. * Используется для чтения и сбора информации о пользователях на сервере вверх и вниз по течению, а также сортируйте их, разбирайте их и отправляйте на сервер для краткого изложения. * @Author Administrator * */Public Class DMSCLIENT {// Определение атрибута // Шаг 1: анализируйте требуемые свойства журнала // файла журнала системы Unix // Сохранить файл проанализированного журнала частного файла Textlogfile; // Mark Mark File Private File LastPositionFile; // Количество записей для каждого журнала анализации частной партии; // Шаг 2: Соедините атрибуты журнала // Сохранить файл Private File Logrecfile; // Сохранить файл private file loginlogfile; // Шаг 3: Разобрать атрибуты журнала // Адрес сервера Private String ServerHost; // порт сервера private int serverport; /*** Метод конструктора, используемый для инициализации клиента* @Throws Exception*/public dmsClient () Throws Exception {try {// 1 Разбор файла конфигурации config.xml map <string, string> config = loadconfig (); // Systing System.out.println (config); // 2 Инициализировать атрибут init (config); } catch (Exception e) {System.out.println ("Инициализация не удалась!"); бросить E; }} / ** * Инициализируйте второй шаг метода конструктора, инициализируйте атрибуты в соответствии с элементом конфигурации * @param config * @Throws Exception * / private void init (map <string> config) throws exection {try {logFile = new File (config.get ("logFile")); textlogfile = new File (config.get ("textlogfile")); LastPositionFile = новый файл (config.get ("lastPositionFile")); batch = integer.parseint (config.get ("paratch")); logrecfile = new File (config.get ("logrecfile")); loginlogfile = new File (config.get ("loginlogfile")); serverhost = config.get ("serverhost"); serverport = integer.parseint (config.get ("serverport")); } catch (Exception e) {System.out.println ("Свойство инициализации не удалось!"); e.printstacktrace (); бросить E; } } /** * The first step in the initialization of the constructor method is to parse the configuration file* @return The returned Map is saved in each item of the configuration file, where key: the name of the tag, * value is the text in the middle of the tag * @throws Exception */ private Map<String,String> loadConfig() throws Exception{ try { SAXReader reader = new SAXReader(); Документ doc = reader.read (новый файл ("config.xml")); Элемент root = doc.getRootelement (); Map <string, string> config = new hashmap <string, string> (); /** Получить все подборы в теге <config>* и используйте имя каждой подразделения в качестве ключа,* в среднем тексту хранится в коллекции карт как значение*/ list <element> list = root.elements (); for (element e: list) {string key = e.getName (); String value = e.getTextTrim (); config.put (ключ, значение); } return config; } catch (Exception e) {System.out.println ("Исключение файла конфигурации Parse!"); e.printstacktrace (); бросить E; }} / *** Метод для клиента начать работу* Три шага цикла:* 1: анализ журнала* 2: соединение журнала* 3: отправить журнал* / public void start () {parselogs (); matchlogs (); SendLogs (); // while (true) {// // parse log // if (! parsegs ()) {// продолжение; //} // // log // if (! matchlogs ()) {// продолжение; //} // // send log // sendlogs (); //}}/** *** *** ** ** **: steplogs* stearly* athure* stearly:* stearly* ateurn:* stearly: Не удалось* / private boolean sendlogs () { /** Идея реализации:* Читать все парные журналы в файле logrecfile*, подключиться к серверу и отправить его, если сервер* Если вы получите все из них, вы можете удалить файл, что означает, что отправка* завершена. * Шаги реализации:* 1: Файл Logrecfile должен существовать* 2: Читать и сохранить все парные журналы в коллекцию* ждать отправки* 3: подключить к серверу через сокет* 4: Создать выходной поток* 5: Отправить все парные журналы в последовательность на сервер в строке* 6: Строка «Отправить». «ОК», это означает, что сервер нормальный * получил все журналы, а затем файл Logrecfile * может быть удален и возвращен истинный означает, что отправка завершена. * */ Сокет сокета = null; попробуйте {// 1 if (! logrecfile.exists ()) {System.out.println (logrecfile+"не существует!"); вернуть ложь; } // 2 список <string> matches = ioutil.loadlogrec (logrecfile); // 3 Socket = New Socket (ServerHost, ServerPort); // 4 PrintWriter PW = New PrintWriter (новый outputStreamWriter (socket.getOutputStream (), "UTF-8")); // 5 для (строки журнала: совпадения) {pw.println (log); } // 6 pw.println ("Over"); pw.flush (); // 7 BufferedReader BR = New BufferedReader (New InputStreamReader (socket.getInputStream (), "UTF-8")); // 8 string response = br.readline (); // 9 if ("ok" .equals (response)) {logrecfile.delete (); вернуть истину; } else {System.out.println ("Отправить журнал не удастся!"); вернуть ложь; }} catch (Exception e) {System.out.println ("Отправить журнал не удастся!"); e.printstacktrace (); } наконец {if (socket! = null) {try {socket.close (); } catch (ioException e) {e.printstackTrace (); }} вернуть false; } /*** Шаг 2: Соедините журнал* @return True: Успешное соединение* false: pairing не удалось* /private boolean matchlogs () { /** Идея реализации:* Прочитайте все новые журналы, проанализированные на первом шаге с журналом для журнала, который был последним паре. * Пока вы можете найти тип 8, вы можете найти журнал журнала, который можно в сочетании с *. * * Шаги реализации: * 1: необходимое суждение * 1.1: существует ли Logrecfile. Если он будет существует, это больше не будет * новая работа для спаривания, чтобы избежать перезаписи. * 1.2: Файл TextLogfile должен существовать. * 2: Прочитайте TextLogfile и прочитайте журналы и * для коллекции. (Несколько экземпляров logdata)* 3: Если существует файл loginlogfile, это означает, что* существует журнал, который не был успешно в паре в прошлый раз, и он также читается* и сохраняется в коллекции, ожидающем пары вместе* 4: Соединение Вход и вход * * * Где клавиша: пользователь, pid * значение: экземпляр LogData * 4.4: пройдите карту входа в систему и найдите соответствующий журнал журнала в логатике в карте входа в соответствии с ключом * из каждого журнала журнала и * Сохранить парный журнал в наборе парных журналов. И удалить журнал журнала в парном журнале* с карты входа в систему. Таким образом, ** у вас не должно быть никакого спасания только при входе в карту. * 5: Записать парные журналы Logrecfile* 6: написать все непарные журналы в loginlogfile* 7: Delete TextLogfile файл* 8: вернуть true, указывая, что сочетание завершено**/try {// 1 //1.1 if (logrecfile.exists ()) {return true; } //1.2 if (! Textlogfile.exists ()) {System.out.println (textlogfile+"не существует!"); вернуть ложь; } // 2 списка <logdata> list = ioutil.loadlogdata (textlogfile); // 3 if (loginlogfile.exists ()) {list.addall (ioutil.loadlogdata (loginlogfile)); } // 4 //4.1 List <logrec> matches = new ArrayList <logrec> (); //4.2 map <string, logdata> loginmap = new hashmap <string, logdata> (); Map <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 (key, logdata); } else if (logdata.getType () == logdata.type_logout) {logoutmap.put (key, logdata); }} //4.4 set <entry <string, logdata >> intrySet = logoutMap.EntrySet (); for (entry <string, logdata> e: intrySet) {logData logout = e.getValue (); Logdata login = loginmap.remove (e.getkey ()); Logrec logrec = new Logrec (Login, Logout); Matches.Add (Logrec); } // 5 ioutil.saveCollection (Matches, Logrecfile); // 6 iOutil.SaveCollection (loginMap.values (), LoginLogfile); // 7 textlogfile.delete (); // 8 вернуть истину; } catch (Exception e) {System.out.println ("log удалось!"); e.printstacktrace (); } вернуть false; } /*** Шаг 1: анализируйте журнал* @return true: parse успешно* false: parse не удастся* /private boolean parselogs () { /** Идея реализации:* Цикл чтения Тем не менее, и * первый шаг повторяет выполнение, в результате чего предыдущий журнал был перезаписан *, вам нужно судить здесь. Если вы сохраните анализируемый журнал*, файл журнала существует, и первый шаг больше не будет выполняться. * Этот файл журнала будет удален после того, как второй шаг будет сочетаться. * 1.2: должен существовать файл файла logfile (файл wtmpx) * 1.3: Есть ли еще журнал, который можно анализировать * 2: Создайте случайный файл для чтения файла logfile * 3: Переместите указатель в последнюю позицию чтения, подготовить * Начните новую работу. Содержимое в каждом журнале (пользователь, PID, тип, время, хост) * и сохранить его с помощью экземпляра logData, а затем сохранить * экземпляр LogData в коллекцию * 5: Сохранить все журналы в коллекции в поведенческих единицах для * textlogfile * 6: Сохранить информацию о закладках * 7: вернуть истинность, указывая на то, что работа завершена * */ randomaccessfile raf = null; try {// 1 //1.1 if (textlogfile.exists ()) {return true; } //1.2 if (! Logfile.exists ()) {System.out.println (logfile+"не существует!"); вернуть ложь; } //1.3 long lastposition = haslogs (); // Скаль // 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 <pacath; i ++) {// перед каждым анализом определите, есть ли все еще журналы, которые можно анализировать, если (logfile.length ()-lastposition <logdata.log_length) {break; } // parse user 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 (); // parse type raf.seek (lastposition+logdata.type_offset); короткий тип = raf.readshort (); // parse time raf.seek (lastposition+logdata.time_offset); int time = raf.readint (); // вставьте хост raf.seek (lastposition+logdata.host_offset); String host = ioutil.readstring (raf, logdata.host_length) .trim (); LogData log = new LogData (пользователь, PID, тип, время, хост); list.add (log); // Скалы // System.out.println (log); // загрузить журнал, обновить LastPosition LastPosition = raf.getFilePointer (); } // 5 ioutil.saveCollection (список, textlogfile); // 6 Сохранить файл закладок iOutil.savelong (LastPosition, LastPositionFile); // 7 вернуть истину; } catch (Exception e) {System.out.println ("Пропуск log не удался!"); e.printstacktrace (); } наконец {if (raf! = null) {try {raf.close (); } catch (ioException e) {e.printstackTrace (); }} вернуть false; } /*** Первый шаг - проанализировать ссылку в журнале. * В соответствии с местоположением записи файла закладок, определите, есть ли все еще * журнал для анализа. Если есть, последняя позиция* будет возвращена. Если нет, верните -1. * @return */ private long haslogs () {try {/ * * Если LastPositionFile не существует, это означает, что * никогда не проанализировано, так что вы можете проанализировать с нуля */ if (! lastpositionFile.exists ()) {return 0; } long lastposition = ioutil.readlong (lastpositionfile); if (logfile.length ()-lastposition> = logdata.log_length) {return lastposition; }} catch (Exception e) {e.printstackTrace (); } return -1; } public static void main (string [] args) {try {dmsClient client = new DMSClient (); client.start (); } catch (Exception e) {System.out.println ("Client Run не удалось!"); }}} 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; java com.dms.bo.logdata; /** * Этот класс представляет собой класс инструментов, который отвечает за операции IO клиента * @author Administrator * */public Class ioutil {/** * Читать каждую строку строки из данного файла (журнал пары) * и сохранить коллекцию, чтобы вернуть * @param file * @return * @throws Exception */public static <string> loadlogrec (файл файл) throws exectore {bufferedread br = null; try {br = new BufferedReader (new InputStreamReader (new FileInputStream (file))); List <string> list = new ArrayList <string> (); String line = null; while ((line = br.readline ())! = null) {list.add (line); } return List; } catch (Exception e) {e.printstackTrace (); бросить E; } наконец {if (br! = null) {br.close (); }}} /** * Прочтите каждый парный журнал из данного файла и сохраните его в * коллекцию, а затем верните. * @param file * @return * @throhs Exception */ public Static List <logdata> loadlogdata (файл файла) Throws exection {BufferedReader br = null; try {br = new BufferedReader (new InputStreamReader (new FileInputStream (file))); Список <logdata> list = new ArrayList <logdata> (); String line = null; while ((line = br.readline ())! = null) {logdata logdata = new logdata (line); list.add (logdata); } return List; } catch (Exception e) {e.printstackTrace (); бросить E; } наконец {if (br! = null) {br.close (); }}} / ** * Запишите указанное длинное значение в первую строку данного файла в виде строки * @param l * @param file * @Throws Exception * / public static void savelong (long lon, файл файла), бросает исключение {printWriter pw = null; try {pw = new PrintWriter (файл); pw.println (lon); } catch (Exception e) {e.printstackTrace (); бросить E; } наконец {if (pw! = null) {pw.close (); }}}} /*** Напишите строку, возвращаемую методом ToString каждого элемента в коллекции в указанный файл в поведенческих единицах. * @param c * @param file * @throws Exception */ public static void savecollection (коллекция c, файл файла) выбрасывает исключение {printwriter pw = null; try {pw = new PrintWriter (файл); для (объект o: c) {pw.println (o); }} catch (Exception e) {e.printstackTrace (); бросить E; } наконец {if (pw! = null) {pw.close (); }}} / ** * Начните непрерывно с текущей позиции данного случайного randomAccessfile * чтения байтов длины и преобразовать их в строку и возвращать * @param raf * @param длина * @return * @throhs exception * / public Static StruckString (randomaccessfile raf, int length) throws exception {trest {byte [] data = new byte]; raf.read (data); вернуть новую строку (данные, "ISO8859-1"); } catch (Exception e) {e.printstackTrace (); бросить E; }} / ** * Прочтите первую строку строки из данного файла, а затем * return * @param file * @return * @throhs exception * / public static long Readlong (файл файла) Throws Exception {BufferedReader br = null; try {br = new BufferedReader (new InputStreamReader (new FileInputStream (file))); String line = br.readline (); вернуть long.parselong (line); } catch (Exception e) {e.printstackTrace (); бросить E; } наконец {if (br! = null) {br.close (); }}}}
4. config.xml
<? xml version = "1.0" Encoding = "UTF-8"?> <config> <!-Имя файла файла системы Unix-> <logfile> wtmpx </logfile> <!-Сохранить имя файла журнала разрешено-> <TextLogfile> log.txt </textlogfile> <!-file file bood-> <lastpositionfile> textposition> lastposition> the lastposition> teble-stosition> the lastposition> txtlile. Количество записей на проанализированное журнал-> <batch> 10 </batch> <!-Парное имя файла журнала-> <logrecfile> logrec.txt </logrecfile> <!-Неправленное имя файла журнала-> <loginlogfile> login.txt </loginlogfile> <! <!-Адрес сервера-> <serverhost> localhost </serverhost> <!-порт сервера-> <serverport> 8088 </serverport> </config>
5. Server-config.xml
<?xml version="1.0" encoding="UTF-8"?><config> <!-- File name of the server that saves the paired log file --> <logrecfile>server-logs.txt</logrecfile> <!-- Number of thread pool threads--> <threadsum>30</threadsum> <!-- Server port--> <serverport>8088</serverport></config>
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.