Este exemplo compartilha o código de implementação específico para ler o login e o upload do usuário do usuário para sua referência. O conteúdo específico é o seguinte
O cliente é executado em um servidor que fornece ao usuário serviços UNIX. Usado para ler e coletar as informações a montante e a jusante dos usuários no servidor, emparelhá -los e organizá -los e enviá -los para o servidor para resumo.
Código de implementação específico:
1. DmSserver.java
pacote com.dms; importar java.io.bufferedReader; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStreamReader; importet java.io.outstreamwriter; import java.io.PrintHiter; importar; java.util.list; importar java.util.map; importar java.util.concurrent.blockockQueue; importar java.util.concurrent.executorService; import java.util.concurrent.exectors; import.utuMue; importar org.dom4j.document; importar org.dom4j.Element; importar org.dom4j.io.saxReader; /** * Servidor DMS, usado para receber * Logs de emparelhamento enviados por cada cliente e salvá -los em um arquivo local * @author administrador * */public class DmServer {// Property Definition // ServerSocket Private ServerSocket Server usado para receber o servidor conectado ao cliente; // Pool de threads usado para gerenciar threads que lidam com o cliente solicita o ExecutorService ThreadPool; // Salvar todos os arquivos enviados pelos clientes para emparelhar os logs privados de arquivos serverLogFile; // Fila de mensagens Private BlockingQueue <String> messageQueue = new LinkedBlockingQueue <String> (); public dmSserver () lança exceção {try {System.out.println ("O servidor está inicializando ..."); // 1 PARE o arquivo de configuração servidor-config.xml mapa <string, string> config = loadConfig (); // 2 Inicialize o atributo init (config); System.out.println ("Inicialização do servidor concluída ..."); } catch (Exceção e) {System.out.println ("Inicialização falhou!"); jogar e; }} / *** A primeira etapa na inicialização do método do construtor é analisar o arquivo de configuração* @Returnar o mapa retornado é salvo em cada item do arquivo de configuração, onde a chave: o nome da tag,* o valor é o texto no meio da tag* @Throws Exception* / private map <string> loadConfig () Throws {Try Exception {Try Exception {Try Exception* / string <string> learlFig () Throws {Try Exception {Try Exception* / string <string> learlFig () Throws {Try Exception {Tast @Throws Exception* / Private <String ,ret >reread) é o tags {Try* @throws excepcionax; Documento doc = leitor.read (novo arquivo ("server-config.xml")); Elemento root = doc.getrootelement (); Mapa <string, string> config = new hashmap <string, string> (); /** Obtenha todas as sub-marcas na tag <FIFG> e salve o nome de cada sub-strag como a chave, e o texto* no meio é o valor na coleção de mapas*/ list <lement> list = root.elements (); para (elemento e: list) {string key = e.getName (); String value = e.getTextTrim (); config.put (chave, valor); } retornar config; } catch (Exceção e) {System.out.println ("Resolva Exceção do arquivo de configuração!"); E.PrintStackTrace (); jogar e; }} /** * A segunda etapa da inicialização do método do construtor é inicializar o atributo de acordo com o item de configuração * @param config * @throws exceção * /private void init (map <string, string> config) lança excepção { / * * inicialize o atributo com <logrecfile> no arquivo de configuração: servidor> * O pool de threads de tamanho fixo é criado. Este valor é usado como o número de threads do pool de threads* inicialize a propriedade com o <ververport> no arquivo de configuração: servidor, aqui esse valor é a porta do servidor do serversocket*/ this.server = new ServerSocket (Integer.parseint (config.get ("serverport"))); this.ServerLogFile = new File (config.get ("Logrecfile")); this.threadpool = executores.newfixedthreadpool (Integer.parseint (config.get ("shreadSum"))); } /** * Método para começar a trabalhar no servidor * @throws Exceção * /public void start () lança Exceção { / * * Requisitos de implementação: * primeiro inicie um tópico separadamente para executar o saveloghandler * Esta tarefa é salvar todos os logs de emparelhamento * e depois começar a ouvir o loop do servidor portas. Depois que um cliente estiver conectado, * instancie um cliente e entregue a tarefa ao pool de threads * para atribuir threads para lidar com a interação com o cliente. * */ try {System.out.println ("O servidor começa a funcionar ..."); Saveloghandler slh = new saveloghandler (); novo thread (SLH) .start (); while (true) {soquete soquete = server.accept (); threadpool.execute (novo cliente (soquete)); }} catch (Exceção e) {e.printStackTrace (); jogar e; }} public static void main (string [] args) {try {dmSserver server = new DmSServer (); server.start (); } catch (Exceção e) {System.out.println ("estação não conseguiu iniciar o servidor!"); }}} / ** * Este tópico é responsável por buscar cada log pareado da fila de mensagens, * e salvá -lo no arquivo serverLogfile * @author administrador * * / classe privada saveloghandler implementa runnable {public void run () {printwriter pw = null; tente {pw = new PrintWriter (new FileOutputStream (ServerLogFile, true)); while (true) {if (messageQueue.size ()> 0) {pw.println (messageQueue.poll ()); } else {pw.flush (); Thread.sleep (500); }}} catch (Exceção e) {e.printStackTrace (); } finalmente {if (pw! = null) {pw.close (); }}}}} / ** * lidera uma solicitação de cliente especificada * @Author Administrator * * / classe privada ClientHandler implementa Runnable {Socket Socket privado; public ClientHandler (soquete) {this.socket = soket; } public void run () { / * * Ideia: * primeiro receba todos os logs emparelhados enviados pelo cliente, * até "over" e, em seguida, salve esses logs parados * no arquivo local e responda ao cliente * "ok" * Execute as etapas: * 1: Crie um fluxo de saída através do log para enviar uma resposta para o cliente * 2: Crie um fluxo de soca -sock é a string "over". Caso contrário, é um log pareado e salve -o no arquivo local. Nesse caso, * pare de ler. * 4: Responder ao cliente "OK" depois de ler com sucesso todos os logs */ printwriter pw = null; tente {// 1 pw = new PrintWriter (novo outputStreamWriter (Socket.getOutputStream (), "UTF-8")); // 2 bufferReader BR = new BufferredReader (new InputStreamReader (Socket.getInputStream (), "UTF-8")); // 3 Mensagem da String = NULL; while ((message = Br.readline ())! = null) {if ("over" .equals (message)) {break; } // Escreva o log em um arquivo para salvar MessageQueue.offer (mensagem); } // 4 pw.println ("ok"); pw.flush (); } catch (Exceção e) {e.printStackTrace (); pw.println ("erro"); pw.flush (); } finalmente {tente {// desconecte do cliente para liberar o recurso soket.close (); } catch (ioexception e) {e.printStackTrace (); }}}}}}}}}}}} 2. Dmsclient.java
pacote com.dms; importar java.io.bufferedReader; importar java.io.file; importar java.io.ioException; importar java.io.inputStreamReader; importar java.io.outputStreamWriter; importação java.io.printwriter; import.mOnocker.rondomAcmaStFile; java.util.hashmap; importar java.util.list; importar java.util.map; importar java.util.map.entry; importar java.util.set; importar org.dom4j.document; importar org.dom4j.Element; importar org.dom4j.io.saxReader; importar com.dms.bo.logdata; importar com.dms.bo.logrec; /*** Este cliente é executado no servidor que fornece aos usuários serviços UNIX. * Usado para ler e coletar as informações a montante e a jusante dos usuários no servidor, emparelhá -los e classificá -los e enviá -los para o servidor para resumo. * @Author Administrator * */public class DMSclient {// Definição de atributo // Etapa 1: analise as propriedades necessárias do arquivo de arquivo de arquivo privado de arquivo de log de log // unix; // Salvar o arquivo do registro de log Parsed Private TextLogFile; // FILE DE BRÁBRO PRIVENTE ARQUIVO PRIVADO LASTPOSIÇÃO; // Número de entradas para cada lote privado do registro privado; // Etapa 2: emparelhar os atributos do log // Salvar o arquivo Private File Logrecfile; // salvar o arquivo Private File LoginLogFile; // Etapa 3: analise os atributos do endereço de log // Endereço do servidor Private String ServerHost; // servidor porta private Int Serverport; /*** Método do construtor, usado para inicializar o cliente* @throws Exception*/public dmsclient () lança exceção {try {// 1 param o arquivo de configuração config.xml map <string, string> config = loadConfig (); // System.out.println (config); // 2 Inicialize o atributo init (config); } catch (Exceção e) {System.out.println ("Inicialização falhou!"); jogar e; }} / ** * inicialize a segunda etapa do método do construtor, inicialize os atributos de acordo com o item de configuração * @param config * @throws exceção * / private void init (map <string, string> config) lança exceção {try {logfile = new File (config.get ("logfile"); textLogfile = novo arquivo (config.get ("textLogfile")); lastPositionFile = novo arquivo (config.get ("lastPositionFile")); Batch = Integer.ParseInt (config.get ("lote")); Logrecfile = novo arquivo (config.get ("Logrecfile")); loginLogfile = novo arquivo (config.get ("loginLogfile")); serverhost = config.get ("serverhost"); Serverport = Integer.parseint (config.get ("serverport")); } catch (Exceção e) {System.out.println ("Propriedade de Inicialização falhou!"); E.PrintStackTrace (); jogar e; }} / ** * A primeira etapa na inicialização do método do construtor é analisar o arquivo de configuração * @RETURN O mapa retornado é salvo em cada item do arquivo de configuração, onde a tecla: o nome da tag, * LOADCONFIG () no meio da tag * @Throws Exception / private map <string, string> loadConfig () Documento doc = leitor.read (novo arquivo ("config.xml")); Elemento root = doc.getrootelement (); Mapa <string, string> config = new hashmap <string, string> (); /** Obtenha todas as sub-marcas na tag <FIFG> e use o nome de cada sub-squisteira como a chave, o* no texto do meio é armazenado na coleção de mapas como valor*/ list <lement> list = root.elements (); para (elemento e: list) {string key = e.getName (); String value = e.getTextTrim (); config.put (chave, valor); } retornar config; } catch (Exceção e) {System.out.println ("Exceção do arquivo de configuração da parse!"); E.PrintStackTrace (); jogar e; }} / *** Método para o cliente começar a funcionar* Três etapas do loop:* 1: analisando o log* 2: emparelhando o log* 3: envie o log* / public void start () {parselogs (); Matchlogs (); sendLogs (); // while (true) {// // analisar log // if (! parselogs ()) {// continua; //} // // emparelhando log /// if (! matchlogs () @stand; // continua; //} // // enviar log // sendlogs (); //}} Falha* / Private Boolean SendLogs () { /** Ideia de implementação:* Leia todos os logs emparelhados no arquivo Logrecfile* e conecte -se ao servidor e envie -o, se o servidor* se você receber todos eles, poderá excluir o arquivo, o que significa que o envio* for concluído. * Etapas de implementação:* 1: O arquivo Logrecfile deve existir* 2: Leia e armazene todos os logs emparelhados em uma coleção* Aguarde o envio* 3: conecte -se ao servidor através do soquete* 4: Crie o fluxo de saída* 5: Envie todos os logs emparelhados* Se a sequência do servidor* 7: Envie a única string "para indicar que todos os logs* foram enviados para o servidor. "OK", significa que o servidor é normal * recebeu todos os logs e, em seguida, o arquivo Logrecfile * pode ser excluído e retornado true significa que o envio está concluído. * */ Soquete soquete = nulo; tente {// 1 if (! Logrecfile.exists ()) {System.out.println (Logrecfile+"não existe!"); retornar falso; } // Lista 2 <String> Matches = ioutil.loadLogrec (Logrecfile); // 3 soquete = novo soquete (ServerHost, Serverport); // 4 PrintWriter pw = new PrintWriter (new OutputStreamWriter (Socket.getOutputStream (), "UTF-8")); // 5 para (String log: corresponde) {pw.println (log); } // 6 pw.println ("over"); pw.flush (); // 7 bufferreader BR = new BufferredReader (new InputStreamReader (Socket.getInputStream (), "UTF-8")); // 8 String Response = Br.readline (); // 9 if ("ok" .equals (resposta)) {Logrecfile.Delete (); retornar true; } else {System.out.println ("Enviar o log falhado!"); retornar falso; }} catch (Exceção e) {System.out.println ("Enviar o log falhado!"); E.PrintStackTrace (); } finalmente {if (soquete! = null) {tente {socket.close (); } catch (ioexception e) {e.printStackTrace (); }} retornar false; } /*** Etapa 2: emparelhar o log* @return true: emparelhamento com sucesso* false: emparelhando falhas* /private boolean matchlogs () { /** Ideia de implementação:* Leia todos os novos logs analisados no primeiro passo com o login que foi o último par de pares com sucesso* e depois segue o usuário,* o mesmo PID, um é 7 e o outro é o outro. * Contanto que você possa encontrar um tipo 8, você pode encontrar um login que possa ser emparelhado com *. * * Etapas de implementação: * 1: Julgamento necessário * 1.1: Se existe Logrecfile. Se existir, não será mais * o novo trabalho de emparelhamento será realizado para evitar substituir. * 1.2: O arquivo textLogfile deve existir. * 2: Leia o TextLogFile e leia os logs e * para a coleção. (Várias instâncias de logdata)* 3: Se o arquivo LoginLogfile existir, significa que* existe um log que não foi emparelhado com sucesso na última vez, e também é lido* e salvo na coleção que esperava ser emparelhada* 4: salvar o login* 4.1: Crie uma coleção para salvar todos os logs emparelhados* 4.2: Criar dois mapas para salvar login e logout* 4.1: Para fazer login e logout * * WHERE CHAVE: Usuário, PID * Valor: Instância LogData * 4.4: Atravesse o mapa de logout e encontre o login correspondente no mapa de login de acordo com a chave * de cada logout e * salve o log emparelhado no conjunto de logs emparelhados. E exclua o login de login no log emparelhado* do mapa de login. Dessa forma, ** você só deve não ter emparelhamento quando efetuar login no mapa. * 5: Escreva logs emparelhados para Logrecfile* 6: Escreva todos os logs não emparelhados para LoginLogFile* 7: Exclua o arquivo textLogfile* 8: retorne true, indicando que o emparelhamento está concluído**/try {// 1 //1.1 se (Logrecfile.exists ()) {retorn true; } //1.2 if (! TextLogfile.exists ()) {System.out.println (textLogFile+"não existe!"); retornar falso; } // Lista 2 <DogData> List = ioutil.loadLogData (textLogfile); // 3 if (loginLogfile.exists ()) {list.addall (ioutil.loadLogData (loginLogfile)); } // 4 //4.1 Lista <Logrec> Matches = new ArrayList <Logrec> (); //4.2 mapa <string, logdata> loginmap = new hashmap <string, logdata> (); Mapa <string, logData> logoutMap = new Hashmap <string, logData> (); //4.3 para (logdata logdata: list) {string key = logdata.getUser ()+ ","+ logdata.getpid (); if (logdata.getType () == logData.type_login) {loginmap.put (chave, logdata); } else if (logdata.gettype () == logdata.type_logout) {logoutmap.put (chave, logdata); }} //4.4 SET <Entrada <String, logData >> EntrySet = logoutMap.entrySet (); para (entrada <string, logdata> e: entrada de entrada) {logdata logout = e.getValue (); Logdata login = loginmap.remove (e.getKey ()); Logrec Logrec = novo Logrec (login, logout); Matches.add (Logrec); } // 5 ioutil.SaveCollection (Matches, Logrecfile); // 6 ioutil.saveCollection (loginmap.values (), loginLogfile); // 7 textLogFile.Delete (); // 8 retorna true; } catch (Exceção e) {System.out.println ("Log em emparelhamento falhou!"); E.PrintStackTrace (); } retornar false; } /*** Etapa 1: Analise o log* @return true: analisar bem -sucedido* false: parse falhou* /private boolean parselogs () { /** Ideia de implementação:* LOOP LEITURA LOOGS LOOPS, depois analise* 5 Informações* em cada um log e finalmente formar uma string, escrevê -lo para o arquivo de textLogFile*, para que* 1, em cada um, seja necessário: 1: Finalmente, a seqüência de lotes. No entanto, e * a primeira etapa repete a execução, fazendo com que o log anterior seja substituído *, você precisa julgar aqui. Se você salvar o log analisado*, o arquivo de log existe e a primeira etapa não será mais executada. * Este arquivo de log será excluído após a emparelhamento da segunda etapa. * 1.2: O arquivo de arquivo de log deve existir (arquivo wtmpx) * 1.3: Ainda existe um log que pode ser analisado * 2: Crie um RandomAccessFile para ler o arquivo de log * 3: Mova o ponteiro para a última posição de leitura, prepare * iniciar um novo parsing de parsing * 4: Parsing Work * 4.1: Criar uma lista de listas * Log após a parsing * Em cada log (usuário, PID, tipo, tempo, host) * e salve -o com uma instância LOGDATA e, em seguida, salve * a instância de logdata na coleção * 5: salve todos os registros na coleção nas unidades de comportamento para * textLogFile * 6: Salvar informações de favoritos * 7: Retornar verdadeiro, indicando que o trabalho é concluído * */ RandomAccessFile RAF = NULL; tente {// 1 //1.1 if (textLogfile.exists ()) {return true; } //1.2 if (! Logfile.exists ()) {System.out.println (logfile+"não existe!"); retornar falso; } //1.3 long lastPosition = haslogs (); // piling // System.out.println (// "lastPosition:"+lastPosition //); if (lastPosition <0) {System.out.println ("Nenhum logs pode ser analisado!"); retornar falso; } // 2 RAF = new RandomAccessFile (LogFile, "R"); // 3 RAF.SEEK (LastPosition); // Lista 4 <GDATA> LIST = new ArrayList <TogData> (); for (int i = 0; i <lote; i ++) {// Antes de cada análise, determine se ainda existem logs que podem ser analisados se (logfile.length ()-lastPosition <logdata.log_length) {break; } // parse o usuário 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 tipo raf.seek (lastPosition+logdata.type_offset); Tipo curto = raf.readshort (); // analisar time raf.seek (lastPosition+logdata.time_offset); int time = raf.readInT (); // colar host RAF.seek (lastPosition+logdata.host_offset); String host = ioutil.readstring (RAF, logdata.host_length) .trim (); Logdata log = novo logdata (usuário, pid, tipo, tempo, host); list.add (log); // piling // System.out.println (log); // Carregar um log, atualize o lastPosition lastPosition = raf.getFilePointer (); } // 5 ioutil.SaveCollection (list, textLogfile); // 6 Salvar o arquivo de favoritos ioutil.savelong (LastPosition, LastPositionFile); // 7 retorna true; } catch (Exceção e) {System.out.println ("Passando o log falhou!"); E.PrintStackTrace (); } finalmente {if (raf! = null) {tente {raf.close (); } catch (ioexception e) {e.printStackTrace (); }} retornar false; } /*** O primeiro passo é analisar um link no log. * De acordo com a localização do registro do arquivo de favoritos, determine se ainda há * log para analisar. Se houver, a última posição* será devolvida. Se não houver, retorne -1. * @return */ private long haslogs () {try {/ * * se o lastPoitionFile não existir, significa que * nunca foi analisado, para que você possa analisar do zero */ if (! lastPositionFile.Exists ()) {retornar 0; } long lastPosition = ioutil.readlong (lastPositionFile); if (logfile.length ()-lastPosition> = logdata.log_length) {return lastPosition; }} catch (Exceção e) {e.printStackTrace (); } retornar -1; } public static void main (string [] args) {try {dmsclient client = new dmsclient (); client.start (); } Catch (Exceção e) {System.out.println ("Run Client Falha!"); }}} 3. Ioutil.java
pacote com.dms; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.RandomAccessFile;import java.util.ArrayList;import java.util.Collection;import java.util.List;import com.dms.bo.logdata; /** * Esta classe é uma classe de ferramenta responsável pelas operações do cliente * @Author Administrator * */public Classe ioutil {/** * Leia cada linha de string do arquivo especificado (LOG LOG) * e salve uma coleção para retornar * @param arquivo * @return * @Throws Exception */public list <brulL> loadLoGrec (arquivo de arquivo) tente {Br = new BufferredReader (new InputStreamReader (new FileInputStream (File)); List <String> list = new ArrayList <String> (); Linha de string = null; while ((line = Br.readline ())! = null) {list.add (linha); } Lista de retorno; } catch (Exceção e) {e.printStackTrace (); jogar e; } finalmente {if (br! = null) {Br.close (); }}} /** * Leia cada log emparelhado do arquivo fornecido e salve -o em uma coleção e retorne. * Arquivo @param * @return * @throws Exception */ public static list <ogdata> loadLogData (arquivo de arquivo) lança exceção {bufferredreader br = null; tente {Br = new BufferredReader (new InputStreamReader (new FileInputStream (File)); Lista <GDData> list = new ArrayList <GDATATA> (); Linha de string = null; while ((line = Br.ReadLine ())! = NULL) {logdata logData = new LogData (linha); list.add (logData); } Lista de retorno; } catch (Exceção e) {e.printStackTrace (); jogar e; } finalmente {if (br! = null) {Br.close (); }}} / ** * Escreva o valor longo especificado na primeira linha do arquivo especificado como uma string * @param l * @param arquivo * @throws exceção * / public static void savelong (long Lon, arquivo de arquivo) lança exceção {printWriter pw = null; tente {pw = new PrintWriter (arquivo); pw.println (LON); } catch (Exceção e) {e.printStackTrace (); jogar e; } finalmente {if (pw! = null) {pw.close (); }}}} /*** Escreva a string retornada pelo método da tostragem de cada elemento na coleção para o arquivo especificado nas unidades de comportamento. * @param c * @param arquivo * @throws Exception */ public static void SaveCollection (coleção C, arquivo de arquivo) lança a exceção {printWriter pw = null; tente {pw = new PrintWriter (arquivo); for (objeto o: c) {pw.println (o); }} catch (Exceção e) {e.printStackTrace (); jogar e; } finalmente {if (pw! = null) {pw.close (); }}} / ** * Comece contínuo a partir da posição atual do RandomAccessfile de RandomAccess * de leitura bytes de comprimento e converta -os em uma string e retorna * @param raf * @param comprimento * @return * @throws Exceção * / public static string readstring (RandomAccessFile RAF, Int Length) lança exceção {Try {Byte [] raf.read (dados); return New String (Data, "ISO8859-1"); } catch (Exceção e) {e.printStackTrace (); jogar e; }} / ** * Leia a primeira linha da string do arquivo especificado e depois * return * @param arquivo * @return * @throws Exception * / public static Long Readlong (arquivo de arquivo) lança exceção {buffaredreader br = null; tente {Br = new BufferredReader (new InputStreamReader (new FileInputStream (File)); Linha de string = br.readline (); retornar long.parselong (linha); } catch (Exceção e) {e.printStackTrace (); jogar e; } finalmente {if (br! = null) {Br.close (); }}}}
4. Config.xml
<?xml version="1.0" encoding="UTF-8"?><config> <!-- unix system log file name --> <logfile>wtmpx</logfile> <!-- save the resolved log file name --> <textlogfile>log.txt</textlogfile> <!-- Bookmark file name --> <lastpositionfile>last-position.txt</lastpositionfile> <!-- Número de entradas por log de parsed-> <batch> 10 </sotch> <!-Nome do arquivo de log emparelhado-> <logrecfile> Logrec.txt </logrecfile> <!-Nome do arquivo de log não pareado-> <loginLogfile> login.txt </loginlogfile> <!-Login Log File-Nome de log-Nome do login-log-> LoginLogFile> Login.txt </loginlogfile> <! <!-Endereço do servidor-> <ServerHost> localhost </ververhost> <!-Porta do servidor-> <ververport> 8088 </sererport> </fabig>
5. Server-config.xml
<? xml versão = "1.0" coding = "utf-8"?> <fifig> <!-Nome do arquivo do servidor que salva o arquivo de log emparelhado-> <logrecfile> server-logs.txt </</</<!-serververt port-número de threads-> Threadsum> 30 <//<!-servert> port-> servidor-servidor-servergert </</</</!-serverver port-> servider.
O exposto acima é tudo sobre este artigo, espero que seja útil para o aprendizado de todos.