java登录日志 java实现登出优质

格式:DOC 上传日期:2023-05-03 18:00:44
java登录日志 java实现登出优质
时间:2023-05-03 18:00:44     小编:zdfb

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。相信许多人会觉得范文很难写?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。

java登录日志 java实现登出篇一

实习日志

推荐度:

实习日志

推荐度:

java程序员年终总结

推荐度:

《瓦尔登湖》读后感

推荐度:

教师培训研修日志

推荐度:

相关推荐

具体实现代码:

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服务端,用来接收每个客户端发送过来的 * 配对日志并保存在本地文件中 * @author administrator * */public class dmsserver { //属性定义 //用来接收客户端连接的服务端的serversocket private serversocket server; //用来管理处理客户端请求的线程的线程池 private executorservice threadpool; //保存所有客户端发送过来配对日志的文件 private file serverlogfile; //消息队列 private blockingqueue

messagequeue = new linkedblockingqueue

(); public dmsserver() throws exception{ try { n("服务端正在初始化..."); //1 map

config = loadconfig(); //2 根据配置文件内容初始化属性 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; } } /** * 构造方法初始化第二步,根据配置项初始化属性 * @param config * @throws exception */ private void init(map

config) throws exception{ /* * 用配置文件中的

初始化属性:serverlogfile * 用配置文件中的

初始化属性:threadpool,这里创建固定大小线程池。该值作为线程池线程数量 * 用配置文件中的

初始化属性:server,这里这个值为serversocket的服务端口 */ = new serversocket( nt(("serverport")) ); logfile = new file( ("logrecfile") ); pool = edthreadpool( nt(("threadsum")) ); } /** * 服务端开始工作的方法 * @throws exception */ public void start() throws exception{ /* * 实现要求: * 首先单独启动一个线程,用来运行saveloghandler * 这个任务,目的是保存所有配对日志 * 然后开始循环监听服务端端口,一旦一个客户端连接了, * 就实例化一个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(){ /* * 思路: * 首先接收客户端发送过来的所有配对日志, * 直到读取到"over"为止,然后将这些配对 * 日志保存到本地的文件中,并回复客户端 * "ok" * 执行步骤: * 1:通过socket创建输出流,用来给客户端 * 发送响应 * 2:通过socket创建输入流,读取客户端发送 * 过来的日志 * 3:循环读取客户端发送过来的每一行字符串,并 * 先判断是否为字符串"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服务的.服务器上。 * 用来读取并收集该服务器上用户的上下线信息,并 * 进行配对整理后发送给服务端汇总。 * @author administrator * */public class dmsclient { //属性定义 //第一步:解析日志所需属性 //unix系统日志文件 private file logfile; //保存解析后日志的文件 private file textlogfile; //书签文件 private file lastpositionfile; //每次解析日志的条目数 private int batch; //第二步:配对日志所需要属性 //保存配对日志的文件 private file logrecfile; //保存未配对日志的文件 private file loginlogfile; //第三步:发送日志所需要属性 //服务端地址 private string serverhost; //服务端端口 private int serverport; /** * 构造方法,用来初始化客户端 * @throws exception */ public dmsclient() throws exception{ try { //1 解析配置文件 map

config = loadconfig(); //打桩 n(config); //2 根据配置文件内容初始化属性 init(config); } catch (exception e) { n("初始化失败!"); throw e; } } /** * 构造方法初始化第二步,根据配置项初始化属性 * @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; } } /** * 客户端开始工作的方法 * 循环执行三步: * 1:解析日志 * 2:配对日志 * 3:发送日志 */ public void start(){ parselogs(); matchlogs(); sendlogs();// while(true){// //解析日志// if(!parselogs()){// continue;// }// //配对日志// if(!matchlogs()){// continue;// }// //发送日志// sendlogs();// } } /** * 第三步:发送日志 * @return true:发送成功 * false:发送失败 */ private boolean sendlogs(){ /* * 实现思路: * 将logrecfile文件中的所有配对日志读取 * 出来然后连接上服务端并发送过去,若服务端 * 全部接收,就可以将该文件删除,表示发送 * 完毕了。 * 实现步骤: * 1:logrecfile文件必须存在 * 2:将所有配对日志读取出来并存入一个集合 * 等待发送 * 3:通过socket连接服务端 * 4:创建输出流 * 5:顺序将所有配对日志按行发送给服务端 * 6:单独发送一个字符串"over"表示所有日志 * 均已发送完毕 * 7:创建输入流 * 8:读取服务端发送回来的响应字符串 * 9:若响应的字符串为"ok",表示服务端正常 * 接收了所有日志,这时就可以将logrecfile * 文件删除并返回true表示发送完毕。 * */ 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("发送日志失败!"); return false; } } catch (exception e) { n("发送日志失败!"); tacktrace(); } finally{ if(socket != null){ try { (); } catch (ioexception e) { tacktrace(); } } } return false; } /** * 第二步:配对日志 * @return true:配对成功 * false:配对失败 */ private boolean matchlogs(){ /* * 实现思路: * 将第一步解析的新日志,与上次为配对成功 * 的登入日志全部读取出来,然后再按照user, * pid相同,type一个是7,一个是8进行配对。 * 只要能找到类型为8的,一定可以找到一个 * 能与之配对的登入日志。 * * 实现步骤: * 1:必要的判断 * 1.1:logrecfile是否存在,存在则不再 * 进行新的配对工作,避免覆盖。 * 1.2:textlogfile文件必须存在。 * 2:读取textlogfile将日志读取出来,并 * 存入到集合中。(若干logdata实例) * 3:若loginlogfile文件若存在,则说明 * 有上次未配对成功的日志,也将其读取 * 出来存入集合等待一起配对 * 4:配对工作 * 4.1:创建一个集合,用于保存所有配对日志 * 4.2:创建两个map分别保存登入日志与登出日志 * 4.3:遍历所有待配对的日志,按照登入与登出 * 分别存入两个map中, * 其中key:user,pid * value:logdata实例 * 4.4:遍历登出map,并根据每条登出日志的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(){ /* * 实现思路: * 循环读取batch条日志,然后将每条日志中的 * 5个信息解析出来,最终组成一个字符串,以 * 行为单位,写入到textlogfile文件中 * * 实现步骤: * 1:必要的判断工作 * 1.1:为了避免解析的日志还没有被使用,而 * 第一步又重复执行导致之前日志被覆盖 * 的问题,这里需要判断,若保存解析后 * 的日志文件存在,则第一步不再执行。 * 该日志文件会在第二步配对完毕后删除。 * 1.2:logfile文件必须存在(wtmpx文件) * 1.3:是否还有日志可以解析 * 2:创建randomaccessfile来读取logfile * 3:将指针移动到上次最后读取的位置,准备 * 开始新的解析工作 * 4:解析工作 * 4.1:创建一个list集合,用于保存解析后 * 的每一条日志(logdata实例) * 4.2:循环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 list

loadlogrec(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当前位置开始连续 * 读取length个字节,并转换为字符串后返回 * @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.xuefen.com.cn/zuowen/2807029.html】

全文阅读已结束,如果需要下载本文请点击

下载此文档