無論是身處學校還是步入社會,大家都嘗試過寫作吧,借助寫作也可以提高我們的語言組織能力。相信許多人會覺得范文很難寫?下面是小編為大家收集的優(yōu)秀范文,供大家參考借鑒,希望可以幫助到有需要的朋友。
java登錄日志 java實現(xiàn)登出篇一
實習日志
推薦度:
實習日志
推薦度:
java程序員年終總結
推薦度:
《瓦爾登湖》讀后感
推薦度:
教師培訓研修日志
推薦度:
相關推薦
具體實現(xiàn)代碼:
package ; import edreader;import ;import outputstream;import ption;import treamreader;import streamwriter;import riter;import socket;import ;import p;import ;import ;import ngqueue;import orservice;import ors;import blockingqueue; import nt;import t;import der; /** * dms服務端,用來接收每個客戶端發(fā)送過來的 * 配對日志并保存在本地文件中 * @author administrator * */public class dmsserver { //屬性定義 //用來接收客戶端連接的服務端的serversocket private serversocket server; //用來管理處理客戶端請求的線程的線程池 private executorservice threadpool; //保存所有客戶端發(fā)送過來配對日志的文件 private file serverlogfile; //消息隊列 private blockingqueue
messagequeue = new linkedblockingqueue
(); public dmsserver() throws exception{ try { n("服務端正在初始化..."); //1 map
config = loadconfig(); //2 根據(jù)配置文件內容初始化屬性 init(config); n("服務端初始化完畢..."); } catch (exception e) { n("初始化服務端失敗!"); throw e; } } /** * 構造方法初始化第一步,解析配置文件 * @return 返回的map中保存的是配置文件中的 * 每一條內容,其中key:標簽的名字, * value為標簽中間的文本 * @throws exception */ private map
loadconfig() throws exception{ try { saxreader reader = new saxreader(); document doc = (new file("server-")); element root = telement(); map
config = new hashmap
(); /* * 獲取
標簽中的所有子標簽 * 并將每一個子標簽的名字作為key,中間的 * 文本作為value存入map集合 */ list
list = ts(); for(element e : list){ string key = e(); string value = ttrim(); (key, value); } return config; } catch (exception e) { n("解析配置文件異常!"); tacktrace(); throw e; } } /** * 構造方法初始化第二步,根據(jù)配置項初始化屬性 * @param config * @throws exception */ private void init(map
config) throws exception{ /* * 用配置文件中的
初始化屬性:serverlogfile * 用配置文件中的
初始化屬性:threadpool,這里創(chuàng)建固定大小線程池。該值作為線程池線程數(shù)量 * 用配置文件中的
初始化屬性:server,這里這個值為serversocket的服務端口 */ = new serversocket( nt(("serverport")) ); logfile = new file( ("logrecfile") ); pool = edthreadpool( nt(("threadsum")) ); } /** * 服務端開始工作的方法 * @throws exception */ public void start() throws exception{ /* * 實現(xiàn)要求: * 首先單獨啟動一個線程,用來運行saveloghandler * 這個任務,目的是保存所有配對日志 * 然后開始循環(huán)監(jiān)聽服務端端口,一旦一個客戶端連接了, * 就實例化一個clienthander,然后將該任務交給線程池 * 使其分配線程來處理與該客戶端的交互。 * */ try { n("服務端開始工作..."); saveloghandler slh=new saveloghandler(); new thread(slh).start(); while(true){ socket socket=(); e(new clienthandler(socket)); } } catch (exception e) { tacktrace(); throw e; } } public static void main(string[] args) { try { dmsserver server = new dmsserver(); (); } catch (exception e) { n("啟動服務端失敗!"); } } /** * 該線程負責從消息隊列中取出每一條配對日志, * 并存入到serverlogfile文件 * @author administrator * */ private class saveloghandler implements runnable{ public void run(){ printwriter pw = null; try { pw = new printwriter( new fileoutputstream( serverlogfile,true ) ); while(true){ if(()>0){ n(()); }else{ (); (500); } } } catch (exception e) { tacktrace(); } finally{ if(pw != null){ (); } } } } /** * 處理一個指定客戶端請求 * @author administrator * */ private class clienthandler implements runnable{ private socket socket; public clienthandler(socket socket){ = socket; } public void run(){ /* * 思路: * 首先接收客戶端發(fā)送過來的所有配對日志, * 直到讀取到"over"為止,然后將這些配對 * 日志保存到本地的文件中,并回復客戶端 * "ok" * 執(zhí)行步驟: * 1:通過socket創(chuàng)建輸出流,用來給客戶端 * 發(fā)送響應 * 2:通過socket創(chuàng)建輸入流,讀取客戶端發(fā)送 * 過來的日志 * 3:循環(huán)讀取客戶端發(fā)送過來的每一行字符串,并 * 先判斷是否為字符串"over",若不是,則是 * 一條配對日志,那么保存到本地文件,若是, * 則停止讀取。 * 4:成功讀取所有日志后回復客戶端"ok" */ printwriter pw = null; try { //1 pw = new printwriter( new outputstreamwriter( putstream(),"utf-8" ) ); //2 bufferedreader br = new bufferedreader( new inputstreamreader( utstream(),"utf-8" ) ); //3 string message = null; while((message = ne())!=null){ if("over".equals(message)){ break; } //將該日志寫入文件保存 (message); } //4 n("ok"); (); } catch (exception e) { tacktrace(); n("error"); (); } finally{ try { //與客戶端斷開連接釋放資源 (); } catch (ioexception e) { tacktrace(); } } } }}
package ; import edreader;import ;import ption;import treamreader;import streamwriter;import riter;import accessfile;import ;import ist;import p;import ;import ;import .entry;import ; import nt;import t;import der; import a;import ; /** * 該客戶端運行在給用戶提供unix服務的.服務器上。 * 用來讀取并收集該服務器上用戶的上下線信息,并 * 進行配對整理后發(fā)送給服務端匯總。 * @author administrator * */public class dmsclient { //屬性定義 //第一步:解析日志所需屬性 //unix系統(tǒng)日志文件 private file logfile; //保存解析后日志的文件 private file textlogfile; //書簽文件 private file lastpositionfile; //每次解析日志的條目數(shù) private int batch; //第二步:配對日志所需要屬性 //保存配對日志的文件 private file logrecfile; //保存未配對日志的文件 private file loginlogfile; //第三步:發(fā)送日志所需要屬性 //服務端地址 private string serverhost; //服務端端口 private int serverport; /** * 構造方法,用來初始化客戶端 * @throws exception */ public dmsclient() throws exception{ try { //1 解析配置文件 mapconfig = loadconfig(); //打樁 n(config); //2 根據(jù)配置文件內容初始化屬性 init(config); } catch (exception e) { n("初始化失敗!"); throw e; } } /** * 構造方法初始化第二步,根據(jù)配置項初始化屬性 * @param config * @throws exception */ private void init(map
config) throws exception{ try { logfile = new file( ("logfile") ); textlogfile = new file( ("textlogfile") ); lastpositionfile = new file( ("lastpositionfile") ); batch = nt( ("batch") ); logrecfile = new file( ("logrecfile") ); loginlogfile = new file( ("loginlogfile") ); serverhost = ("serverhost"); serverport = nt( ("serverport") ); } catch (exception e) { n("初始化屬性失敗!"); tacktrace(); throw e; } } /** * 構造方法初始化第一步,解析配置文件 * @return 返回的map中保存的是配置文件中的 * 每一條內容,其中key:標簽的名字, * value為標簽中間的文本 * @throws exception */ private map
loadconfig() throws exception{ try { saxreader reader = new saxreader(); document doc = (new file("")); element root = telement(); map
config = new hashmap
(); /* * 獲取
標簽中的所有子標簽 * 并將每一個子標簽的名字作為key,中間的 * 文本作為value存入map集合 */ list
list = ts(); for(element e : list){ string key = e(); string value = ttrim(); (key, value); } return config; } catch (exception e) { n("解析配置文件異常!"); tacktrace(); throw e; } } /** * 客戶端開始工作的方法 * 循環(huán)執(zhí)行三步: * 1:解析日志 * 2:配對日志 * 3:發(fā)送日志 */ public void start(){ parselogs(); matchlogs(); sendlogs();// while(true){// //解析日志// if(!parselogs()){// continue;// }// //配對日志// if(!matchlogs()){// continue;// }// //發(fā)送日志// sendlogs();// } } /** * 第三步:發(fā)送日志 * @return true:發(fā)送成功 * false:發(fā)送失敗 */ private boolean sendlogs(){ /* * 實現(xiàn)思路: * 將logrecfile文件中的所有配對日志讀取 * 出來然后連接上服務端并發(fā)送過去,若服務端 * 全部接收,就可以將該文件刪除,表示發(fā)送 * 完畢了。 * 實現(xiàn)步驟: * 1:logrecfile文件必須存在 * 2:將所有配對日志讀取出來并存入一個集合 * 等待發(fā)送 * 3:通過socket連接服務端 * 4:創(chuàng)建輸出流 * 5:順序將所有配對日志按行發(fā)送給服務端 * 6:單獨發(fā)送一個字符串"over"表示所有日志 * 均已發(fā)送完畢 * 7:創(chuàng)建輸入流 * 8:讀取服務端發(fā)送回來的響應字符串 * 9:若響應的字符串為"ok",表示服務端正常 * 接收了所有日志,這時就可以將logrecfile * 文件刪除并返回true表示發(fā)送完畢。 * */ socket socket = null; try { //1 if(!()){ n(logrecfile+"不存在!"); return false; } //2 list
matches = grec(logrecfile); //3 socket = new socket(serverhost,serverport); //4 printwriter pw = new printwriter( new outputstreamwriter( putstream(),"utf-8" ) ); //5 for(string log : matches){ n(log); } //6 n("over"); (); //7 bufferedreader br = new bufferedreader( new inputstreamreader( utstream(),"utf-8" ) ); //8 string response = ne(); //9 if("ok".equals(response)){ logrecfile.(); return true; }else{ n("發(fā)送日志失敗!"); return false; } } catch (exception e) { n("發(fā)送日志失敗!"); tacktrace(); } finally{ if(socket != null){ try { (); } catch (ioexception e) { tacktrace(); } } } return false; } /** * 第二步:配對日志 * @return true:配對成功 * false:配對失敗 */ private boolean matchlogs(){ /* * 實現(xiàn)思路: * 將第一步解析的新日志,與上次為配對成功 * 的登入日志全部讀取出來,然后再按照user, * pid相同,type一個是7,一個是8進行配對。 * 只要能找到類型為8的,一定可以找到一個 * 能與之配對的登入日志。 * * 實現(xiàn)步驟: * 1:必要的判斷 * 1.1:logrecfile是否存在,存在則不再 * 進行新的配對工作,避免覆蓋。 * 1.2:textlogfile文件必須存在。 * 2:讀取textlogfile將日志讀取出來,并 * 存入到集合中。(若干logdata實例) * 3:若loginlogfile文件若存在,則說明 * 有上次未配對成功的日志,也將其讀取 * 出來存入集合等待一起配對 * 4:配對工作 * 4.1:創(chuàng)建一個集合,用于保存所有配對日志 * 4.2:創(chuàng)建兩個map分別保存登入日志與登出日志 * 4.3:遍歷所有待配對的日志,按照登入與登出 * 分別存入兩個map中, * 其中key:user,pid * value:logdata實例 * 4.4:遍歷登出map,并根據(jù)每條登出日志的key * 去登入map中找到對應的登入日志,并 * 以一個logrec實例保存該配對日志,然后 * 存入配對日志的集合中。并將該配對日志 * 中的登入日志從登入map中刪除。這樣一來 * 登入map中應當只剩下沒有配對的了。 * 5:將配對日志寫入到logrecfile中 * 6:將所有未配對日志寫入到loginlogfile中 * 7:將textlogfile文件刪除 * 8:返回true,表示配對完畢 * */ try { //1 //1.1 if(()){ return true; } //1.2 if(!text()){ n(textlogfile+"不存在!"); return false; } //2 list
list = gdata(textlogfile); //3 if(login()){ all( gdata(loginlogfile) ); } //4 //4.1 list
matches = new arraylist
(); //4.2 map
loginmap = new hashmap
(); map
logoutmap = new hashmap
(); //4.3 for(logdata logdata : list){ string key = r()+","+ (); if(e()==_login){ (key, logdata); }else if(e()==_logout){ (key, logdata); } } //4.4 set<entry
> entryset = et(); for(entry
e : entryset){ logdata logout = ue(); logdata login = (()); logrec logrec = new logrec(login,logout); (logrec); } //5 llection(matches, logrecfile); //6 llection( (),loginlogfile ); //7 textlogfile.(); //8 return true; } catch (exception e) { n("配對日志失敗!"); tacktrace(); } return false; } /** * 第一步:解析日志 * @return true:解析成功 * false:解析失敗 */ private boolean parselogs(){ /* * 實現(xiàn)思路: * 循環(huán)讀取batch條日志,然后將每條日志中的 * 5個信息解析出來,最終組成一個字符串,以 * 行為單位,寫入到textlogfile文件中 * * 實現(xiàn)步驟: * 1:必要的判斷工作 * 1.1:為了避免解析的日志還沒有被使用,而 * 第一步又重復執(zhí)行導致之前日志被覆蓋 * 的問題,這里需要判斷,若保存解析后 * 的日志文件存在,則第一步不再執(zhí)行。 * 該日志文件會在第二步配對完畢后刪除。 * 1.2:logfile文件必須存在(wtmpx文件) * 1.3:是否還有日志可以解析 * 2:創(chuàng)建randomaccessfile來讀取logfile * 3:將指針移動到上次最后讀取的位置,準備 * 開始新的解析工作 * 4:解析工作 * 4.1:創(chuàng)建一個list集合,用于保存解析后 * 的每一條日志(logdata實例) * 4.2:循環(huán)batch次,解析每條日志中的 * 5項內容(user,pid,type,time,host) * 并用一個logdata實例保存,然后將 * 該logdata實例存入集合 * 5:將集合中的所有的日志以行為單位保存到 * textlogfile中 * 6:保存書簽信息 * 7:返回true,表示工作完畢 * */ randomaccessfile raf = null; try { //1 //1.1 if(text()){ return true; } //1.2 if(!()){ n(logfile+"不存在!"); return false; } //1.3 long lastposition = haslogs(); //打樁// n(// "lastposition:"+lastposition// ); if(lastposition<0){ n("沒有日志可以解析了!"); return false; } //2 raf = new randomaccessfile(logfile,"r"); //3 (lastposition); //4 list
list = new arraylist
(); for(int i=0;i<batch;i++){ //每次解析前都判斷是否還有日志可以解析 if(()-lastposition
=_length){ return lastposition; } } catch (exception e) { tacktrace(); } return -1; } public static void main(string[] args) { try { dmsclient client = new dmsclient(); (); } catch (exception e) { n("客戶端運行失敗!"); } }}
package ; import edreader;import ;import inputstream;import treamreader;import riter;import accessfile;import ist;import tion;import ; import a; /** * 該類是一個工具類,負責客戶端的io操作 * @author administrator * */public class ioutil { /** * 從給定的文件中讀取每一行字符串(配對日志) * 并存入一個集合后返回 * @param file * @return * @throws exception */ public static listloadlogrec(file file) throws exception{ bufferedreader br = null; try { br = new bufferedreader( new inputstreamreader( new fileinputstream( file ) ) ); list
list = new arraylist
(); string line = null; while((line = ne())!=null){ (line); } return list; } catch (exception e) { tacktrace(); throw e; } finally{ if(br != null){ (); } } } /** * 從給定的文件中讀取每一條配對日志,并存入 * 一個集合中然后返回。 * @param file * @return * @throws exception */ public static list
loadlogdata(file file) throws exception{ bufferedreader br = null; try { br = new bufferedreader( new inputstreamreader( new fileinputstream( file ) ) ); list
list = new arraylist
(); string line = null; while((line = ne())!=null){ logdata logdata = new logdata(line); (logdata); } return list; } catch (exception e) { tacktrace(); throw e; } finally{ if(br!=null){ (); } } } /** * 將指定的long值以字符串的形式寫入到 * 給定文件的第一行 * @param l * @param file * @throws exception */ public static void savelong( long lon,file file) throws exception{ printwriter pw = null; try { pw = new printwriter(file); n(lon); } catch (exception e) { tacktrace(); throw e; } finally{ if(pw != null){ (); } } } /** * 將集合中每個元素的tostring方法返回的字符串 * 以行為單位寫入到指定文件中。 * @param c * @param file * @throws exception */ public static void savecollection( collection c,file file) throws exception{ printwriter pw = null; try { pw = new printwriter(file); for(object o : c){ n(o); } } catch (exception e) { tacktrace(); throw e; } finally{ if(pw != null){ (); } } } /** * 從給定的randomaccessfile當前位置開始連續(xù) * 讀取length個字節(jié),并轉換為字符串后返回 * @param raf * @param length * @return * @throws exception */ public static string readstring( randomaccessfile raf,int length) throws exception{ try { byte[] data = new byte[length]; (data); return new string(data,"iso8859-1"); } catch (exception e) { tacktrace(); throw e; } } /** * 從給定文件中讀取第一行字符串,然后將其 * 轉換為一個long值后返回 * @param file * @return * @throws exception */ public static long readlong(file file) throws exception{ bufferedreader br = null; try { br = new bufferedreader( new inputstreamreader( new fileinputstream( file ) ) ); string line = ne(); return ong(line); } catch (exception e) { tacktrace(); throw e; } finally{ if(br != null){ (); } } }}
<"1.0" encoding="utf-8">wtmpx
10
localhost
8088
5. server-<"1.0" encoding="utf-8">
30
8088
s("content_relate");
【java讀取用戶登入退出日志上傳服務端】相關文章:
java如何讀取csv
09-29
java讀取郵件的方法
09-27
java讀取csv的方法大全
12-04
java如何通過url讀取文件
09-28
java如何讀取圖片exif信息
09-27
java讀取解析xml文件實例
09-25
java讀取郵件的方法有哪些
12-03
講述java讀取properties文件的方法
12-02
java讀取圖片exif信息的代碼
11-30
【本文地址:http://www.aiweibaby.com/zuowen/2807029.html】