liuxiaolong
2019-11-04 5a8bbcb100f37b8e17d6fda0d851d96dbace46e4
src/main/java/com/cloud/count/listener/CountListener.java
@@ -10,6 +10,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
@@ -21,15 +23,9 @@
 */
public class CountListener implements ApplicationListener<ContextRefreshedEvent> {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private CountDao dao;
    static final String CRLF = System.getProperty("line.separator");
    static ServerSocket server;
    static Integer port = 2010;
    static boolean isServerReboot = false;
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
@@ -46,157 +42,17 @@
                catch (IOException e){
                    e.printStackTrace();
                }
                String encoding = "UTF-8";
                BufferedReader iReader = null;
                BufferedWriter iWriter = null;
                StringBuilder sb = null;
                String lineContent = null;
                while (true){
                    Socket client = null;
                    try{
                        client = server.accept();
                        iReader = new BufferedReader(new InputStreamReader(client.getInputStream(), encoding));
                        iWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), encoding));
                        InputStream is=client.getInputStream();
                        byte[] b=new byte[1024];
                        is.read(b);
                        String str = new String(b);
                        sendAck(iWriter);
                        try{
                            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());//出去人数增量
                                System.out.println("TotalEnters:"+people.getEnters());
                                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);
//                                }
                               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 (Exception e){
                            System.out.println(e.getMessage());
                        }
                        new Thread(new CountThread(client)).start();
                    }catch (IOException ex){
                    }finally {
                        try {
                            if(iWriter !=null)
                                iWriter.close();
                            if(iReader !=null)
                                iReader.close();
//                            if(client !=null)
//                                client.close();
                        }catch (IOException e){
                        }
                    }
                }
            }
        }).start();
    }
    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.write(content);
            iWriter.flush();
            iWriter.close();
        } 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();
        }
    }
}