长连接:
package com.sichang.util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.StringTokenizer;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.sichang.dao.DBBase;import com.sichang.dao.DBService;public class Server_Socket2 { static DBService db = DBBase.getInstance();// 实例化dao static Responseutil responseutil = new Responseutil(); public void startSocketService() { ServerSocket serverSocket = null; while(true) { try { if(serverSocket == null) { serverSocket = new ServerSocket(9090); } else { Socket socket = serverSocket.accept(); //主线程获取客户端连接 Thread workThread = new Thread(new Handler(socket)); //创建线程 workThread.start(); //启动线程 } } catch(Exception e) { e.printStackTrace(); } } } class Handler implements Runnable { private Socket socket; public Handler(Socket socket) { this.socket=socket; } @SuppressWarnings("unchecked") public void run() { try { while(socket.isConnected()) { BufferedReader br = null; PrintWriter pw = null; System.out.println("新连接:"+socket.getInetAddress()+":"+socket.getPort()); socket.setSoTimeout(5000); InputStream in = socket.getInputStream(); InputStreamReader is = new InputStreamReader(in); br = new BufferedReader(is); String info = br.readLine(); System.out.println("9090:" + info); String SwitchState = ""; if (info != null) { // 行车轨迹 if (info.contains("pathHistory")) { // 处理传递过来的字符串 Listlist = String2List(info); // 调用插入行车轨迹方法 insertPathHistory(list); /********************查询开关状态数据给设备***********************/ String IMSI = Responseutil.beEqual(list.get(1).toString()); String selectSwitchStateOK = db.selectSwitchState(IMSI).toString(); SwitchState = JSONResolveArray(getRowsData(selectSwitchStateOK), "#"); } // 心跳包 if (info.contains("Tick")) { /********************查询开关状态数据给设备***********************/ // 处理传递过来的字符串 List list = String2List(info); String IMSI = Responseutil.beEqual(list.get(1).toString()); String selectSwitchStateOK = db.selectSwitchState(IMSI).toString(); SwitchState = JSONResolveArray(getRowsData(selectSwitchStateOK), "#"); } // 设备注册 if (info.contains("deviceRegister")) { // 处理传递过来的字符串 List list = String2List(info); SwitchState = deviceRegister(list); } OutputStream out = socket.getOutputStream(); pw = new PrintWriter(out); pw.print(SwitchState);// pw.print("\n"); pw.flush(); } else { break; } // 关闭// in.close();// is.close();// br.close();// // out.close();// pw.close(); Thread.sleep(100); } } catch(Exception e) { e.printStackTrace(); } finally { if(socket.isClosed() == false) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } /** * 去掉= 等于号前面的数据 * @param data * @return * @throws Exception */ public static String beEqual(String data){ String dest = ""; Pattern p = Pattern.compile(".*="); Matcher m = p.matcher(data); dest = m.replaceAll(""); //System.out.println("处理后的字符="+dest); return dest; } // 将字符串转换为list @SuppressWarnings("rawtypes") public static List String2List(String info){ // 处理传递过来的字符串 List list=new ArrayList (); StringTokenizer st=new StringTokenizer(info,"&"); while(st.hasMoreTokens()){ list.add(st.nextToken()); } return list; } // 解析JSON数组2 public static String JSONResolveArray(String ResponseStr, String divideStr) { String returnArrayStr = ""; JSONArray arr = null; try { arr = new JSONArray(ResponseStr); for (int i = 0; i < arr.length(); i++) { JSONArray temp = (JSONArray) arr.get(i); // if (!temp.getString(i).equals("")) // { for (int j = 0; j < temp.length(); j++) { returnArrayStr += temp.getString(j) + divideStr; } // } } } catch (Exception e) { e.printStackTrace(); } return returnArrayStr; } // 设备注册 @SuppressWarnings("rawtypes") public static String deviceRegister(List list){ String SwitchState=""; String IMSI = Responseutil.beEqual(list.get(1).toString()); String selectDeadlineOK = db.selectDeadline(IMSI).toString(); if(getResultData(selectDeadlineOK).equals("OK")){ String Deadline = JSONResolveArray(getRowsData(selectDeadlineOK),""); if(Deadline.equals("null") || "".equals(Deadline)){ // 开始初始化 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String created = df.format(new Date()); String updatesim_idOk = db.updatesim_id(IMSI, created,"12").toString();// 初始化 if(getResultData(updatesim_idOk).equals("OK")){ // 这里还要添加亲情号码 FamilyNumber SwitchState=responseutil.getServiceInfo()+"#"+familyNumber(IMSI)+"#"; }else{ System.out.println("初始化失败"); } }else{ // 查询出IMSI信息发送给客户端 SwitchState=responseutil.getServiceInfo()+"#"+familyNumber(IMSI)+"#"; } }else{ System.out.println(selectDeadlineOK); } return SwitchState; } // 获取亲情号码 public static String familyNumber(String IMSI){ String familyNumber = ""; String familyNumberOK = db.familyNumber(IMSI).toString(); if(getResultData(familyNumberOK).equals("OK")){ familyNumber = JSONResolveArray(getRowsData(familyNumberOK),""); if (familyNumber.length()<1) { familyNumber = "null"; } }else { } return familyNumber; } // 插入数据库 @SuppressWarnings("rawtypes") public static void insertPathHistory(List list){ String IMSI = Responseutil.beEqual(list.get(1).toString()); String sendTime = Responseutil.beEqual(list.get(2).toString()).replaceAll("T"," "); String tableName = "Z_"+Responseutil.tailTime(sendTime); String positions = Responseutil.beEqual(list.get(3).toString()); String speed = Responseutil.beEqual(list.get(4).toString()); System.out.println("IMSI "+IMSI); System.out.println("sendTime "+sendTime); System.out.println("tableName "+tableName); System.out.println("positions"+ positions); System.out.println("speed "+speed); // 判断数据库表是否存在,如果有,则插入,如果没有,则创建 if(judgeTable(tableName)){ // 插入数据库 db.insertThatDayTable(tableName, IMSI, sendTime, courseData(positions), speed).toString(); }else{ // 创建数据库并插入数据 String createTableOK = db.createTable(tableName).toString(); if(getResultData(createTableOK).equals("OK")){ //System.out.println("创建成功,开始插入"); db.insertThatDayTable(tableName, IMSI, sendTime, courseData(positions), speed).toString(); }else{ System.out.println("创建失败:"+createTableOK); } } } // 取出result节点的值的方法 public static String getResultData(String data) { // 开始取出result节点的数据 JSONObject jsonderice; Object dericeObject = null; try { jsonderice = new JSONObject(data); dericeObject = jsonderice.get("result"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return dericeObject.toString(); } // 判断数据库表是否存在 public static boolean judgeTable(String date){ String JudgeTableOK = db.JudgeTable(date).toString(); System.out.println("JudgeTableOK "+JudgeTableOK); String rowsdata = JSONResolveArray(getRowsData(JudgeTableOK), ""); System.out.println(rowsdata); if("".equals(rowsdata)){ // 没有表 return false; }else{ // 有表 return true; } } // 处理上传上来的经纬度数据2 public static String courseData(String positions){ String str=""; String[] positionS=positions.split("\\/"); for (int i = 0; i < positionS.length; i++) { String[] positionSs = positionS[i].split(","); str +=Responseutil.BigDeci(Double.parseDouble(positionSs[0]))+","+Responseutil.BigDeci(Double.parseDouble(positionSs[1]))+"|"; } // System.out.println("处理过精度的轨迹:"+str); return str; } // 取出rows节点的值的方法 public static String getRowsData(String data) { JSONObject jsobj; Object pesObj = null; try { jsobj = new JSONObject(data); pesObj = jsobj.get("rows"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return pesObj.toString(); }}