文档章节

web项目中加入socket(加强版)

别寒
 别寒
发布于 2015/08/20 11:09
字数 985
阅读 1K
收藏 8

「深度学习福利」大神带你进阶工程师,立即查看>>>

长连接:

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();
	}

}





别寒
粉丝 30
博文 273
码字总数 155300
作品 0
永州
程序员
私信 提问
加载中
此博客有 2 条评论,请先登录后再查看。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.1K
18
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
7
mvc框架--Razor

Razor 是一个轻巧而优雅的servlet mvc框架 # 又一个轮子? no,写就她是为了证实我个人的某些想法,并在这个过程中练练手,这两种冲动碰撞在一起,自然而然地产生了Razor # Razor的现在和未来...

dtubest
2013/01/25
3.1K
0
opm-server-mirror

代码更新 2009-11-25: 加入反爬虫功能。直接Web访问服务器将跳转到Google。 使用方法 下载index.zip 解压index.zip得到index.php 将index.php传到支持php和cURL的国外服务器上 打开 http:/...

luosheng86
2013/01/29
1K
0
Web开发组件管理器--Bower

Bower 是一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。 功能有些类似于Component。不同之处是,Component是围绕Git...

匿名
2013/02/01
1.2W
2

没有更多内容

加载失败,请刷新页面

加载更多

【每周CV论文】初学深度学习图像对比度增强应该要读的文章

欢迎来到《每周CV论文》。在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的。 图像对比度增强,即增强图像中的有用信息,抑...

言有三
昨天
0
0
运营商大数据-行业大数据获客利器

一、永远不要沉溺在安逸里得过且过,能给你遮风挡雨的,同样能让你不见天日,只有让自己更加强大,才能真正撑起一片天。 二、别把生活当作游戏,谁游戏人生,生活就惩罚谁,这不是劝诫,而是...

osc_1wo6kipk
26分钟前
0
0
【Rust日报】2020-08-10:在 Rust 中存储连续数据

在 Rust 中存储连续数据? 作者都帮你整理好了: 使用 Rust 中的数组 [T; N]. Slice &[T] or &mut [T], 可以方便的 split. Boxed slice Box<[T]>. Vec. 长度和内容都可以变化,这可能是我们最常...

MikeTang
昨天
19
0
Gradient Centralization: 一行代码加速训练并提升泛化能力 | ECCV 2020 Oral

梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理   来源:晓飞的算法工程...

zb1486966459725
昨天
0
0
移动大数据-装修行业获客利器

因为海伦凯勒的努力和坚毅不拔的个性,而赢得了大家的肯定,终于得到了诺贝尔文学奖。虽然得了诺贝尔奖,但她对生命依然奋战不懈,她马不停蹄的到各地学校里演讲。有一次,她到一所大学演讲,...

osc_qheq8wav
27分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部