文档章节

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

别寒
 别寒
发布于 2015/08/20 11:09
字数 985
阅读 935
收藏 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();
	}

}





© 著作权归作者所有

共有 人打赏支持
别寒
粉丝 29
博文 271
码字总数 137605
作品 0
永州
程序员
私信 提问
加载中

评论(2)

别寒
别寒

引用来自“大海2015”的评论

您好,请问您是如何在项目中使用socket的呢?我看您这个项目应该也是用来和设备通信的,向请教一下,谢谢!
在项目中直接使用就可以了,开启一个线程,创建socket,监听端口,然后处理就行了,我的代码有写
大海2015
您好,请问您是如何在项目中使用socket的呢?我看您这个项目应该也是用来和设备通信的,向请教一下,谢谢!
基于 JavaFX 开发的聊天客户端 - OIM

一、简介 OIM是一套即时通讯的聊天系统,在这里献给大家,一方面希望能够帮助对即时通讯有兴趣研究的朋友,希望我们能够共同进步,另一个就是希望能够帮助到需要即时通讯系统的朋友或者企业,...

烙灵
2017/06/09
0
23
Mockplus3.3上新,免费体验团队管理和所有专业功能!

Mockplus是更快更简单的原型设计工具,在3.31版本中推出了团队版和企业版。 Mockplus团队版和企业版专为原型项目设计协作打造,可以更好地实现团队管理和协作设计。 查看视频,10分钟了解Moc...

mo311
03/16
0
0
dreamsfly/weaving-socket

图文版教程:https://my.oschina.net/u/2476624/blog QQ交流群17375149 新版本更新: 2015-8-8 增加U3D游戏客户的通讯项目支持,并提供示例内容。 2017-5-3更新新版本。老版本在多协议公用业务...

dreamsfly
2015/12/21
0
0
minggeJS1.9.0加强版,年前最后一次更新

如果 minggeJS1.6比如成一个“初生婴儿",那么minggeJS1.9.0已经”18岁“了!,JQUERY作者以前走过的坑,minggeJS又重新走了一次,minggeJS是在 舆论压力下成长起来的。但凡经历过磨练的作品...

明哥先生
2016/01/29
1K
9
Spring boot项目配置SSL

SSL(Secure Socket Layer,安全套接层)是为了网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。 SSL协议可分为两层: SSL记录协议(SSL Record Protocol...

anla_
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

logback.xml 配置

需要引入 logback-core-1.1.2.jar <?xml version="1.0" encoding="UTF-8"?><configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 --> ......

夜醒者
7分钟前
0
0
Java 11 已发布,String 还能这样玩!

在文章《Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码》中,我有介绍到 Java 11 的八个新特性,其中关于 String 加强部分,我觉得有点意思,这里单独再拉出来讲。 Java 11 增加...

Java技术栈
31分钟前
5
0
什么是以太坊DAO?(二)

Decentralized Autonomous Organization,简称DAO,以太坊中重要的概念。一般翻译为去中心化的自治组织。 在上一节中,我们为了展示什么是DAO创建了一个合约,就像一个采用邀请制的俱乐部,会...

geek12345
47分钟前
4
0
全屋WiFi彻底无死角 这才是终极解决方案

无线网络现在不仅在家庭中不可或缺,在酒店、医院、学校等场景中的需求也越来越多。尤其是这些场景中,房间多但也需要每个房间都能够完美覆盖WiFi,传统的吸顶式AP就无法很好的解决问题。 H3...

linux-tao
今天
4
0
Python日期字符串比较

需要用python的脚本来快速检测一个文件内的二个时间日期字符串的大小,其实实现很简单,首先一些基础的日期格式化知识如下 复制代码 %a星期的简写。如 星期三为Web %A星期的全写。如 星期三为...

dragon_tech
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部