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