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());
|
|
|
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));
|
String msgStr = "";
|
String xmlStr = "";
|
People people = null;
|
InputStream is = client.getInputStream();
|
byte[] b;
|
while (true) {
|
b = new byte[1024];
|
is.read(b);
|
msgStr = new String(b);
|
System.out.println("msgStr:"+msgStr);
|
sendAck(iWriter);
|
|
xmlStr = XmlUtil.toXmlStr(msgStr);
|
|
// 如果存在TotalEnters。则证明返回的是实时数据的xml
|
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);
|
|
//总进入数量或者总出去数量,不一定哪一个先到2字节int的上限65535
|
// if( CountServiceImpl.totalEnters < CountServiceImpl.baseEnters){
|
// //表示统计设备重新启动了,统计参数归零
|
// CountServiceImpl.initCountArgs(people);
|
// }
|
|
//总进入人数小于总出去的人数,表示统计设备在放学时间(出去的人数大于进入的人数)重启了
|
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 (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 connectionAlive = "Connection: Keep-Alive"+CRLF ;
|
String contentLengthLine = "Content-Length: 0"+CRLF +CRLF;
|
|
try {
|
iWriter.write(statusLine);
|
iWriter.write(contentTypeLine);
|
iWriter.write(connectionAlive);
|
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 = "<ErrorList><Error>error</Error></ErrorList>";
|
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();
|
}
|
}
|
}
|