package com.jiuqi.mobile.lbs.intf; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.concurrent.*; public class SocketAppServer { private int port=9612; private ServerSocket serverSocket; private ExecutorService executorService;//线程池 private final int POOL_SIZE=10;//单个CPU线程池大小 public SocketAppServer() throws IOException{ serverSocket=new ServerSocket(port); //Runtime的availableProcessor()方法返回当前系统的CPU数目. executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); System.out.println("服务器启动,正在等待连接端口port=" + port + "..."); } public void service(){ try{ while(true){ Socket socket=null; try { //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接 System.out.println("open socket service"); socket=serverSocket.accept(); System.out.println(socket); executorService.execute(new Handler(socket)); System.out.println("one end "); } catch (Exception e) { e.printStackTrace(); } } }finally{ System.out.println("end"); } } public static void main(String[] args) throws IOException { new SocketAppServer().service(); } } class Handler implements Runnable{ private Socket socket; public Handler(Socket socket){ this.socket=socket; } private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return new PrintWriter(socketOut,true); } private BufferedReader getReader(Socket socket) throws IOException{ InputStream socketIn=socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public String echo(String msg){ return "echo:"+msg; } public void run(){ try { System.out.println("接收到请求,来自"+socket.getInetAddress()+":"+socket.getPort()); InputStream in = socket.getInputStream(); byte[] bytes = new byte[1024]; while(!socket.isClosed()){ in.read(bytes); String string = new String(bytes); if("close".equals(string)){ break; } byte[] bs = "234".getBytes("utf8"); String s = new String(bs, "utf8"); System.out.println(string); } // DataInputStream din = new DataInputStream(in); // String receveStr = din.readUTF(); // System.out.println("接收到客户端指令:" + receveStr); // String result = Location(receveStr); // OutputStream out = socket.getOutputStream(); // DataOutputStream dout = new DataOutputStream(out); // 获取输出流,并创建相应的数据输出流 // dout.writeUTF(result);// 将字符串写入输出流 // System.out.println("已成功处理" +receveStr + "并返回" + result); // out.flush(); // out.close(); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(socket!=null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 处理上行指令 * * @param name */ private String Location(String receveStr) { String result = ""; String yzResult = "1"; Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String nowtime = sdf.format(cal.getTime()); String top = "DIRS01"; String backLength = ""; String topStr = receveStr.substring(0, 5);// 字头 String bodyStr = receveStr.substring(6);// 去除字头后的字符串 String packageLength = receveStr.substring(6, 10);// 字符串长度 String comondStr = receveStr.substring(10, 12);// 功能指令 String packageStr = receveStr.substring(12, 16);// 包序号(0000) String middleReceive = bodyStr.substring(0, bodyStr.length() - 2);// 去字头和字尾后两位的中间串 String endStr = receveStr.substring(receveStr.length() - 2, receveStr .length());// 后两位16进制 String endShould = encodeStr(middleReceive).substring( encodeStr(middleReceive).length() - 2, encodeStr(middleReceive).length()).toUpperCase();// 分析中间串后取16进制 // 判断处理返回指 if (comondStr != null && comondStr.equals("10")) { backLength = "0027"; } else if (comondStr.equals("05")) { backLength = "0027"; } else if (comondStr.equals("09")) { backLength = "0013"; } if (Integer.parseInt(packageLength) != bodyStr.length()) { // 长度不对,返回 yzResult = "0"; System.out.println("指令验证失败:长度不对:接收长度" + Integer.parseInt(packageLength) + "-实际长度-" + bodyStr.length()); } else if (endShould == null || (endShould != null && !endShould.equals(endStr))) { // 后两位验证失败,不匹配 yzResult = "0"; System.out.println("指令验证失败:尾数不正确:接收到--" + endStr + "-实际-" + endShould); } else { // 验证成功 yzResult = "1"; // 判断指令内容 if (comondStr != null && comondStr.equals("09")) { // 预警信息--保存至预警信息表中并推送至客户端 dealWarnInfo(receveStr); } } String middle = backLength + comondStr + packageStr + yzResult; if (comondStr != null && (comondStr.equals("10") || comondStr.equals("05"))) { middle += nowtime; } String end = encodeStr(middle).substring( encodeStr(middle).length() - 2, encodeStr(middle).length()) .toUpperCase(); System.out.println("----" + end); result = top + middle + end; return result; } private void dealWarnInfo(String receveStr) { String childId = receveStr.substring(33, 41);// 卡片ID String bs = receveStr.substring(55, 56);// 状态(0:进校,1:出校) String time = receveStr.substring(41, 55);// 考勤时间 // 向监护人客户端推送考勤信息 // sendMessageToCo(childId, bs, time,coSim); // 保存入库 saveInfoIntoBaseData(childId, bs, time); } /** * 保存信息 * * @param childId * @param bs * @param time */ private void saveInfoIntoBaseData(String childId, String bs, String time) { DataBase db = new DataBase(); String sql = "insert into t_recv_warns (id,CARDID,RECVTIME,type,ISDEAL,ISREAD) " + "values(SEQ_recv_warns.nextval,'" + childId + "',to_date('" + time + "','yyyyMMddHH24Miss'),'" + bs + "',0,0)"; db.executeUpdate(sql); } /** * 将字符串中每个字符对应的ASCII码求和后转16进制 * * @param middle * @return */ private static String encodeStr(String middle) { int strToAssica = 0; char[] cs = middle.toCharArray(); for (int i : cs) { strToAssica += i; } return Integer.toHexString(strToAssica); } } class DataBase { Connection conn = null; Statement stmt = null; ResultSet rs = null; public DataBase() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); // 加载驱动 } catch (java.lang.ClassNotFoundException e) { System.err.println(e.getMessage()); } } // 更新数据 public int executeUpdate(String sql) { int i = 0; try { String url = "jdbc:oracle:thin:@116.255.134.181:1521:jqdb"; String user = "GAZXUSER"; String password = "Rd7yDs#6k9wpT$GL"; if (conn == null || conn.isClosed()) { conn = DriverManager.getConnection(url, user, password);// 连接数据库 } stmt = conn.createStatement(); i = stmt.executeUpdate(sql); } catch (SQLException e) { System.err.println(e.getMessage()); e.printStackTrace(); return i; } return i; } // 关闭数据库连接 public void close() { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); System.out.println("错误:" + e); } } }