package com.cloud.count.listener; import com.cloud.count.dao.CountDao; import com.cloud.count.model.CountState; import com.cloud.count.model.People; import com.cloud.count.service.serviceImpl.CountServiceImpl; import com.cloud.count.utils.XmlUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class CountThread implements Runnable { private Logger logger = LoggerFactory.getLogger(this.getClass()); static boolean isServerReboot = false; private CountDao dao; static final String CRLF = System.getProperty("line.separator"); private Socket client; public CountThread(Socket socket) { this.dao = BeanContext.getBean("countDao"); this.client = socket; } String encoding = "UTF-8"; BufferedReader iReader = null; BufferedWriter iWriter = null; @Override public void run() { try{ iReader = new BufferedReader(new InputStreamReader(client.getInputStream(), encoding)); iWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), encoding)); while (true) { String str = iReader.readLine(); sendAck(iWriter); String xmlStr = XmlUtil.toXmlStr(str); // 如果存在TotalEnters。则证明返回的是实时数据的xml People people = null; if(xmlStr.indexOf("TotalEnters")>-1){ people = XmlUtil.realTimeXmlToPeople(xmlStr); int inCreEnter = CountServiceImpl.addEnter(people.getEnters());//进入人数增量 int inCreExit = CountServiceImpl.addExit(people.getExits());//出去人数增量 CountServiceImpl.totalEnters += inCreEnter; CountServiceImpl.totalExits += inCreExit; people.setEnters(CountServiceImpl.totalEnters);//将累加后的数量存到数据库中 people.setExits(CountServiceImpl.totalExits); boolean resultB = dao.savePeople(people); System.out.println("totalEnters:"+CountServiceImpl.totalEnters); //总进入数量或者总出去数量,不一定哪一个先到2字节int的上限65535 // if( CountServiceImpl.totalEnters < CountServiceImpl.baseEnters){ // //表示统计设备重新启动了,统计参数归零 // CountServiceImpl.initCountArgs(people); // } op: if(!isServerReboot){ isServerReboot = true; CountState state = dao.getCountState();//恢复统计状态 Date nowDate = new Date(); Date BaseDate = new Date(state.getBaseTime()*1000L); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if(!sdf.format(nowDate).equals(sdf.format(BaseDate))){//历史数据不等于当天 CountServiceImpl.baseEnters = people.getEnters(); CountServiceImpl.baseExits = people.getExits(); CountServiceImpl.realtimeBaseEnters = people.getEnters(); CountServiceImpl.realtimebBaseExits = people.getExits(); CountServiceImpl.errorCount = 0; break op; } //还原状态 CountServiceImpl.baseEnters = state.getBaseEnters(); CountServiceImpl.baseExits = state.getBaseExits(); CountServiceImpl.totalEnters = state.getTotalEnters(); CountServiceImpl.totalExits = state.getTotalExits(); CountServiceImpl.realtimeBaseEnters = state.getRealtimeBaseEnters(); CountServiceImpl.realtimebBaseExits = state.getRealtimeBaseExits(); CountServiceImpl.errorCount = state.getErrorCount(); } //总进入人数小于总出去的人数,表示统计设备在放学时间(出去的人数大于进入的人数)重启了 if(CountServiceImpl.totalEnters < CountServiceImpl.totalExits){ CountServiceImpl.errorCount = CountServiceImpl.totalExits - CountServiceImpl.totalEnters; }else CountServiceImpl.errorCount = 0; CountState currentState = new CountState(); currentState.setBaseEnters(CountServiceImpl.baseEnters); currentState.setBaseExits(CountServiceImpl.baseExits); currentState.setTotalEnters(CountServiceImpl.totalEnters); currentState.setTotalExits(CountServiceImpl.totalExits); currentState.setRealtimeBaseEnters(CountServiceImpl.realtimeBaseEnters); currentState.setRealtimeBaseExits(CountServiceImpl.realtimebBaseExits); currentState.setErrorCount(CountServiceImpl.errorCount); currentState.setBaseTime(people.getTimestamp()); dao.updateCountState(currentState);//更新当前统计状态 } else { System.out.println("noTotalEners"); } // 如果存在ReportData。则证明返回的是统计数据的xml if(xmlStr.indexOf("ReportData")>-1){ people = XmlUtil.xmlToPeople(xmlStr); dao.savePeople(people); } } }catch (IOException ex){ }catch (Exception e){ System.out.println("exception:"+e.getMessage()); } finally { try { if(iWriter !=null) iWriter.close(); if(iReader !=null) iReader.close(); if(client !=null) client.close(); }catch (IOException e){ System.out.println("finally exception:"+e.getMessage()); } } } public static void sendAck(BufferedWriter iWriter) { String statusLine = "HTTP/1.0 200 OK"+CRLF; String contentTypeLine = "Content-type: text/html"+CRLF ; String connectionClose = "Connection: Keep-Alive"+CRLF ; String contentLengthLine = "Content-Length: 0"+CRLF +CRLF;; try { iWriter.write(statusLine); iWriter.write(contentTypeLine); iWriter.write(connectionClose); iWriter.write(contentLengthLine); iWriter.flush(); } catch (IOException ex) { ex.printStackTrace(); } } // Send nack public static void sendNack(BufferedWriter iWriter) { String statusLine = "HTTP/1.1 400 Bad Request" + CRLF; String contentTypeLine = "Content-type: text/html" + CRLF; String connectionClose = "Connection: close" + CRLF; String content = "error"; String contentLengthLine = "Content-Length: " + (new Integer(content.length())).toString() + CRLF + CRLF; try { iWriter.write(statusLine); iWriter.write(contentTypeLine); iWriter.write(connectionClose); iWriter.write(contentLengthLine); iWriter.write(content); iWriter.flush(); } catch (IOException ex) { ex.printStackTrace(); } } }