java读取用户登入退出日志上传服务端
具体实现代码:
1. DMSServer.java
messageQueue = new LinkedBlockingQueue ; public DMSServer throws Exception try System.out.println“服务端正在初始化."; //1 解析配置文件l Map党校培训自我鉴定
config = loadConfig; //2 根据配置文件内容初始化属性initconfig; System.out.println"服务端初始化完毕..."; catch Exception e
System.out.println"初始化服务端失败!"; throw e; /__ * 构造方法初始化第一步,解析配置文件* @return 返回的Map中保存的是配置文件中的* 每一条内容,其中key:标签的名字,* value为标签中间的文本*
@throws Exception */ private Map
读取配置文件失败loadConfig throws Exception try SAXReader reader = new SAXReader; Document doc = adnew l"; Element root = RootElement; Map
config = new HashMap
; /* * 获取
标签中的所有子标签* 并将每一个子标签的名字作为key,中间的* 文本作为value存入Map集合*/ List
list = root.elements; forElement e : list String key = e.getName; String value = e.getTextTrim; config.putkey, value; return config; catch Exception e System.out.println"解析配置文件异常!"; e.printStackTrace; throw e; /__ * 构造方法初始化第二步,根据配置项初始化属性* @param config *
@throws Exception */ private void initMap
config throws Exception /* * 用配置文件中的
初始化属性:serverLogFile * 用配置文件中的
初始化属性:threadPool,这里创建固定大小线程池。该值作为线程池线程数量* 用配置文件中的
初始化属性:server,这里这个值为ServerSocket的服务端口*/ this.server = new ServerSocket "serverport" ; this.serverLogFile = new "logrecfile" ; this.threa
dPool = wFixedThreadPool "threadsum" ; /__ * 服务端开始工作的方法* @throws Exception */ public void start throws Exception /* * 实现要求: * 首先单独启动一个线程,用来运行SaveLogHandler * 这个任务,目的是保存所有配对日志* 然后开始循环监听服务端端口,一旦一个客户端连接了,* 就实例化一个ClientHander,然后将该任务交给线程池* 使其分配线程来处理与该客户端的交互。* */ try System.out.println"服务端开始工作..."; SaveLogHandler slh=new SaveLogHandler; new Threadslh.start; whiletrue Socket socket=server.accept; utenew ClientHandlersocket; catch Exception e e.printStackTrace; throw e; public static void mainString[]
args try DMSServer server = new DMSServer; server.start; catch Exception e System.out.println"启动服务端失败!"; /__ * 该线程负责从消息队列中取出每一条配对日志,* 并存入到serverLogFile文件* @author Administrator * */ private class SaveLogHandler implements Runnable public void run PrintWriter pw = null; try pw = new PrintWriter new FileOutputStream serverLogFile,true ; whiletrue ifmessageQueue.size0 pw.printlnmessageQueue.poll; else pw.flush; Thread.sleep500; catch Exception e e.printStackTrace; finally ifpw != null pw.close; /__ * 处理一个指定客户端请求* @author Administrator * */ private class ClientHandler implements Runnable private Socket socket; public ClientHandlerSocket socket this.socket = socket; public void run /* * 思路: * 首先接收客户端发送过来
的所有配对日志,* 直到读取到"OVER"为止,然后将这些配对_日志保存到本地的文件中,并回复客户端* "OK" * 执行步骤: * 1:通过Socket创建输出流,用来给客户端* 发送响应* 2:通过Socket创建输入流,读取客户端发送* 过来的日志* 3:循环读取客户端发送过来的每一行字符串,并* 先判断是否为字符串"OVER",若不是,则是* 一条配对
日志,那么保存到本地文件,若是,* 则停止读取。* 4:成功读取所有日志后回复客户端"OK" */ PrintWriter pw = null; try //1 pw = new PrintWriter new OutputStream,"UTF-8" ; //2 BufferedReader br = new BufferedReader new InputStream,"UTF-8" ; //3 String message = null; whilemessage = br.readLine!=null if"OVER".equalsmessage break; //将该日志写入文件保
李宇春结婚存messageQueue.offermessage; //4 pw.println"OK"; pw.flush; catch Exception e e.printStackTrace; pw.println"ERROR"; pw.flush; finally try //与客户端断开连接释放资源socket.close; catch IOException e
公司名网e.printStackTrace;
2. DMSClient.java
config = loadConfig; //打桩System.out.printlnconfig; //2 根据配置文件内容初始化属性initconfig; catch Exception e System.out.println"初始化失败!"; throw e; /__ * 构造方法初始化第二步,根据配置项初始化属性*
@param config * @throws Exception */ private void initMap config throws Exception try logFile = new "logfile" ; textLogFile = new "textlogfile" ; lastPositionFile = new File
<"lastpositionfile" ; batch = Integer."batch" ; logRecFile = new "logrecfile" ; loginLogFile = new "loginlogfile" ; serverHost = "serverhost"; serverPort = Integer."serverport" ; catch Exception e
System.out.println"初始化属性失败!"; e.printStackTrace; throw e; /__ * 构造方法初始化第一步,解析配置文件* @return 返回的Map中保存的是配置文件中的* 每一条内容,其中key:标签的名字,* value为标签中间的文本* @throws Exception */ private Map
loadConfig throws Exception try SAXReader reader = new SAXReader; Document doc = adnew l"; Element root =
阮巡
config = new HashMap
; /* * 获取
标签中的所有子标签* 并将每一个子标签的名字作为key,中间的* 文本作为value存入Map集合*/ List
list = root.elements; forElement e : list String key = e.getName; String value = e.getTextTrim; config.putkey, value; return config; catch Exception e System.out.println"解析配置文件异常!"; e.printStackTrace; throw e; /__ * 客户端开始工作的方法* 循环执行三步: * 1:解析日志* 2:配对日志* 3:发送日志*/ public void start parseLogs; matchLogs; sendLogs;// whiletrue// //解析日志// 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
发布评论