web项目中加入socket(加强版)
博客专区 > 别寒 的博客 > 博客详情
web项目中加入socket(加强版)
别寒 发表于2年前
web项目中加入socket(加强版)
  • 发表于 2年前
  • 阅读 672
  • 收藏 8
  • 点赞 0
  • 评论 2

腾讯云 技术升级10大核心产品年终让利>>>   

长连接:

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
博文 254
码字总数 130346
评论 (2)
大海2015
您好,请问您是如何在项目中使用socket的呢?我看您这个项目应该也是用来和设备通信的,向请教一下,谢谢!
别寒

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

您好,请问您是如何在项目中使用socket的呢?我看您这个项目应该也是用来和设备通信的,向请教一下,谢谢!
在项目中直接使用就可以了,开启一个线程,创建socket,监听端口,然后处理就行了,我的代码有写
×
别寒
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: