长连接:
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"))
{
// 处理传递过来的字符串
List<String> list = 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<String> 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<String> 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<String> list=new ArrayList<String>();
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();
}
}