1、SocketServiceLoader.java

package cn.xydata.pharmacy.api.app.test; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * 將socket service隨tomcat啟動 * * @author huajian */ public class SocketServiceLoader implements ServletContextListener { // socket server 線程 private SocketThread socketThread; @Override public void contextDestroyed(ServletContextEvent arg0) { if (null != socketThread && !socketThread.isInterrupted()) { socketThread.closeSocketServer(); socketThread.interrupt(); } } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub if (null == socketThread) { // 新建線程類 socketThread = new SocketThread(null); // 啟動線程 socketThread.start(); } } }
2、SocketThread.java

package cn.xydata.pharmacy.api.app.test; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import javax.servlet.ServletContext; /** * socket 線程類 * * @author huajian */ public class SocketThread extends Thread { private ServerSocket serverSocket = null; public SocketThread(ServerSocket serverScoket) { try { if (null == serverSocket) { //InetAddress address=InetAddress.getByName("192.168.0.4"); //System.out.println("服務器ip:"+address); //this.serverSocket = new ServerSocket(6002,5,address); this.serverSocket = new ServerSocket(6002); System.out.println("socket start"); } } catch (Exception e) { System.out.println("SocketThread創建socket服務出錯"); e.printStackTrace(); } } public void run() { while (!this.isInterrupted()) { try { Socket socket = serverSocket.accept(); if (null != socket && !socket.isClosed()) { // 處理接受的數據 new SocketOperate(socket).start(); } socket.setSoTimeout(0); } catch (Exception e) { e.printStackTrace(); } } } public void closeSocketServer() { try { if (null != serverSocket && !serverSocket.isClosed()) { serverSocket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) throws UnknownHostException { InetAddress address=InetAddress.getByName("180"); System.out.println(address.getHostName());//需要訪問DNS服務器才能得到域名 InetAddress address1=InetAddress.getByName("1.2.3.4");//IP地址不存在 System.out.println(address1.getHostName());//直接返回IP地址 } }
3、SocketOperate.java

package cn.xydata.pharmacy.api.app.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketTimeoutException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.servlet.ServletContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import cn.xydata.pharmacy.api.app.wx.Test1; import cn.xydata.pharmacy.api.app.wx.WxAPI; import cn.xydata.pharmacy.dao.meetings.MeetingDao; import cn.xydata.pharmacy.dto.meetings.MeetingEquipmentDto; import cn.xydata.pharmacy.dto.meetings.MeetingInfoDto; import cn.xydata.pharmacy.dto.meetings.MeetingParticipantDto; import cn.xydata.pharmacy.dto.meetings.ParticipantInfoDto; import cn.xydata.pharmacy.dto.wechat.AccessTokenDto; import cn.xydata.pharmacy.service.WechatMsgService; import cn.xydata.pharmacy.util.CommonUtil; import cn.xydata.pharmacy.util.DateUtil; import cn.xydata.pharmacy.util.WsPool; import cn.xydata.pharmacy.wechat.AccessToken; import cn.xydata.pharmacy.wechat.HttpReqUtil; import cn.xydata.pharmacy.wechat.JsonUtil; import cn.xydata.pharmacy.wechat.SystemConstant; import cn.xydata.pharmacy.wechat.TemplateMsgResult; import cn.xydata.pharmacy.wechat.WechatConfig; import cn.xydata.pharmacy.wechat.WechatTemplateMsg; import cn.xydata.pharmacy.wechat.enterprise.EwConfig; import cn.xydata.pharmacy.wechat.enterprise.MessageModel; /** * 多線程處理socket接收的數據 * * @author huajian * */ @Component public class SocketOperate extends Thread { @Autowired private WechatMsgService wechatMsgService; @Autowired private MeetingDao meetingDao; private Socket socket; public SocketOperate() { super(); } public static SocketOperate socketOperate; public void init() throws Exception { socketOperate = this; } public SocketOperate(Socket socket) { this.socket = socket; } @SuppressWarnings("unused") public void run() { try { InputStream in = socket.getInputStream(); PrintWriter out = new PrintWriter(socket.getOutputStream()); // BufferedReader wt = new BufferedReader(new // InputStreamReader(System.in)); byte b[]=new byte[10]; String string = ""; // while(in.read(b) != -1) { //in.read(readBytesFromInputStream(in, 10)); while(in.read(b) != -1) { System.out.println("原始數據changdu:"+in.read(b)); string = Test1.bytesToHexFun2(b); System.out.println("客戶端發來:" + string.toString()); //List<String> listData = getSocketDatas(string); // for(String s : listData){ //string = string.substring(string.indexOf("00008"), string.indexOf("00008")+8); //獲取access_token if("09".equals(string.substring(0, 2)) && string.indexOf("00008") != -1){ String czsbNo = ""; for(MeetingEquipmentDto me : queryEquipment("czsb")){ //車載識別推送 czsbNo += me.geteNo() + "|"; } if(queryEquipment("hyqd").get(0).geteNo().equals(string.substring(2, 4))){ //簽到消息推送 signTemplatePush(string); }else if(queryEquipment("cjldts").get(0).geteNo().equals(string.substring(2, 4))){ //車間亮點推送 normalPush(string); }else if(czsbNo.indexOf(string.substring(2, 4)) != -1){ //車載識別 pushCarSign(string); } } //out.flush(); //out.close(); } //socket.close(); //System.out.println("socket stop....."); } catch (IOException ex) { } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { } } public static List<MeetingEquipmentDto> queryEquipment(String useNo){ MeetingEquipmentDto me = new MeetingEquipmentDto(); me.setUseNo(useNo); return socketOperate.meetingDao.queryEquipment(me); } //推送會議簽到消息 public static void signTemplatePush(String string) throws Exception{ string = string.substring(string.indexOf("00008"), string.indexOf("00008")+8); //根據最小時間差獲取會議信息 MeetingInfoDto meeting = SocketOperate.getCloseTime(); //根據openId獲取RFID卡號獲取用戶信息 ParticipantInfoDto pid = new ParticipantInfoDto(); pid.setRfidNo(string); List<ParticipantInfoDto> participants = socketOperate.meetingDao.queryAllParticipants(pid); if(participants.size() > 0){ pid = participants.get(0); MeetingParticipantDto mp = new MeetingParticipantDto(); mp.setMpId(pid.getMpId()); mp.setMiId(meeting.getMiId()); mp.setIsDeleted(10); List<MeetingParticipantDto> mps = socketOperate.meetingDao.queryMeetingParticipants(mp); if(mps.size() > 0){ mp = mps.get(0); //只給未簽到的用戶推送消息 int diffMinuter = DateUtil.difftimeByMinutes(DateUtil.getDateFormatByMm(new Date()), meeting.getStartTime()); if(mp.getIsSign() == 10 ){ mp.setIsSign(11); mp.setSignTime(DateUtil.getDateFormatBySS(new Date())); mp.setRealName(pid.getRealName()); ParticipantInfoDto bean = new ParticipantInfoDto(); bean.setMpId(mp.getMpId()); ParticipantInfoDto p = socketOperate.meetingDao.queryAllParticipants(bean).get(0); socketOperate.meetingDao.updateMp(mp); WsPool.sendMessageToAll(p.getRealName()+","+p.getPosition()+","+mp.getSeatNo()); MessageModel model = new MessageModel(); model.setContent(queryEquipment("hyqd").get(0).getPushContent()); model.setTousers(mp.getWeChat()); WxAPI w = new WxAPI(); w.sendText(model); } } } } //車間亮點推送 public static void normalPush(String string) throws Exception{ string = string.substring(string.indexOf("00008"), string.indexOf("00008")+8); //根據最小時間差獲取會議信息 MeetingInfoDto meeting = SocketOperate.getCloseTime(); //根據openId獲取RFID卡號獲取用戶信息 ParticipantInfoDto pid = new ParticipantInfoDto(); pid.setRfidNo(string); List<ParticipantInfoDto> participants = socketOperate.meetingDao.queryAllParticipants(pid); if(participants.size() > 0){ pid = participants.get(0); MeetingParticipantDto mp = new MeetingParticipantDto(); mp.setMpId(pid.getMpId()); mp.setMiId(meeting.getMiId()); mp.setIsDeleted(10); List<MeetingParticipantDto> mps = socketOperate.meetingDao.queryMeetingParticipants(mp); if(mps.size() > 0){ mp = mps.get(0); //只給未推送的用戶推送消息 int diffMinuter = DateUtil.difftimeByMinutes(DateUtil.getDateFormatByMm(new Date()), meeting.getStartTime()); if(mp.getIsPush() == 10 ){ mp.setIsPush(11); ParticipantInfoDto bean = new ParticipantInfoDto(); bean.setMpId(mp.getMpId()); ParticipantInfoDto p = socketOperate.meetingDao.queryAllParticipants(bean).get(0); socketOperate.meetingDao.updateMp(mp); // WsPool.sendMessageToAll(p.getRealName()+","+p.getPosition()+","+mp.getSeatNo()); MessageModel model = new MessageModel(); model.setContent(queryEquipment("cjldts").get(0).getPushContent()); model.setTousers(mp.getWeChat()); WxAPI w = new WxAPI(); w.sendText(model); } } } } //推送車輛簽到消息 public static void pushCarSign(String string) throws Exception{ string = string.substring(string.indexOf("00008"), string.indexOf("00008")+8); //根據最小時間差獲取會議信息 MeetingInfoDto meeting = SocketOperate.getCloseTime(); //根據openId獲取RFID卡號獲取用戶信息 ParticipantInfoDto pid = new ParticipantInfoDto(); pid.setRfidNo(string); List<ParticipantInfoDto> participants = socketOperate.meetingDao.queryAllParticipants(pid); if(participants.size() > 0){ pid = participants.get(0); MeetingParticipantDto mp = new MeetingParticipantDto(); mp.setMpId(pid.getMpId()); mp.setMiId(meeting.getMiId()); mp.setIsDeleted(10); List<MeetingParticipantDto> mps = socketOperate.meetingDao.queryMeetingParticipants(mp); if(mps.size() > 0){ mp = mps.get(0); //只給未簽到的用戶推送消息 //int diffMinuter = DateUtil.difftimeByMinutes(DateUtil.getDateFormatByMm(new Date()), meeting.getStartTime()); if(!(string.substring(2, 4)).equals(mp.getCarNo())){ //上錯車 //個人推送 MessageModel model = new MessageModel(); model.setContent("車輛簽到失敗,您上錯車啦,請聯系引導員"); model.setTousers(mp.getWeChat()); WxAPI w = new WxAPI(); w.sendText(model); //引導員推送(暫不需要) // MeetingParticipantDto ydy = new MeetingParticipantDto(); // ydy.setCarNo(string); // ydy.setIsCarLeader(10); // List<MeetingParticipantDto> ydys = socketOperate.meetingDao.queryMeetingParticipants(ydy); // ydy = ydys.get(0); // MessageModel model2 = new MessageModel(); // model2.setContent("有乘客上錯車,該乘客姓名為:"+mp.getRealName()+",手機號為:"+mp.getTelephone()+",請聯系該乘客換乘正確的車輛!"); // model2.setTousers(ydy.getWeChat()); // WxAPI w2 = new WxAPI(); // w2.sendText(model2); }else{ //未上錯車 if(mp.getIsCarSign() == 10){ mp.setIsCarSign(11); mp.setCarSignTime(DateUtil.getDateFormatBySS(new Date())); mp.setRealName(pid.getRealName()); ParticipantInfoDto bean = new ParticipantInfoDto(); bean.setMpId(mp.getMpId()); ParticipantInfoDto p = socketOperate.meetingDao.queryAllParticipants(bean).get(0); socketOperate.meetingDao.updateMp(mp); //WsPool.sendMessageToAll(p.getRealName()+","+p.getPosition()+","+mp.getSeatNo()); MessageModel model = new MessageModel(); model.setContent("車輛簽到成功"); model.setTousers(mp.getWeChat()); WxAPI w = new WxAPI(); w.sendText(model); } } } } } //推送通知消息 public static void noticeTemplatePush(String string) throws Exception{ string = string.substring(string.indexOf("00008"), string.indexOf("00008")+8); String access_Token = obtainAccessToken(); //根據最小時間差獲取會議信息 MeetingInfoDto meeting = SocketOperate.getCloseTime(); //根據openId獲取RFID卡號獲取用戶信息 ParticipantInfoDto pid = new ParticipantInfoDto(); pid.setRfidNo(string); List<ParticipantInfoDto> participants = socketOperate.meetingDao.queryAllParticipants(pid); List<MeetingParticipantDto> mps = new ArrayList<MeetingParticipantDto>(); MeetingParticipantDto mp = new MeetingParticipantDto(); if(participants.size() > 0){ pid = participants.get(0); mp.setMpId(pid.getMpId()); mp.setMiId(meeting.getMiId()); mp.setIsDeleted(10); mp.setIsLead(10); mps = socketOperate.meetingDao.queryMeetingParticipants(mp); if(mps.size() > 0){ mp = mps.get(0); //領隊個人參會信息 int diffMinuter = DateUtil.difftimeByMinutes(DateUtil.getDateFormatByMm(new Date()), meeting.getStartTime()); if("".equals(mp.getRemark()) || mp.getRemark() == null ){ mp.setRemark("11"); socketOperate.meetingDao.updateMp(mp); //根據領隊個人參會信息查詢除該領隊外的所有小組成員參會信息 List<MeetingParticipantDto> allMs = new ArrayList<MeetingParticipantDto>(); allMs = socketOperate.meetingDao.queryMeetingParticipantsExpectSelf(mp); for(MeetingParticipantDto m : allMs){ if(!"".equals(m.getWeChat())){ //拼接推送信息 TreeMap<String, TreeMap<String, String>> params = new TreeMap<String, TreeMap<String, String>>(); // 根據具體模板參數組裝 params.put("first", WechatTemplateMsg.item("歡迎來到卷包車間F5機台,請點擊查看詳細內容", "#000000")); params.put("keyword1", WechatTemplateMsg.item("ZB48包裝機組", "#000000")); params.put("keyword2", WechatTemplateMsg.item("會務組", "#000000")); params.put("remark", WechatTemplateMsg.item("", "#000000")); WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg(); //模板ID (簽到成功通知) wechatTemplateMsg.setTemplate_id(WechatConfig.TEMPLATE_FWJDTX); wechatTemplateMsg.setTouser(m.getWeChat()); //點擊跳轉url(客戶端首頁) wechatTemplateMsg.setUrl(WechatConfig.TEMPLATE_FWJDTX_URL); wechatTemplateMsg.setData(params); String data = JsonUtil.toJsonString(wechatTemplateMsg); socketOperate.wechatMsgService.sendTemplate(null,access_Token, data); } } } } } } private static List<String> getSocketDatas(String datas){ List<String> list = new ArrayList<String>(); String arr[] = datas.split("00008"); for(int i=1;i<arr.length;i++){ list.add("00008"+arr[i].substring(0, 3)); } list = removeDuplicate(list); return list; } private static List<String> removeDuplicate(List<String> list) { LinkedHashSet<String> set = new LinkedHashSet<String>(list.size()); set.addAll(list); list.clear(); list.addAll(set); return list; } //獲取access_token 公用方法 public static String obtainAccessToken() throws Exception{ AccessTokenDto accessToken = new AccessTokenDto(); accessToken.setAgentId(EwConfig.AGENT_ID); accessToken = socketOperate.meetingDao.queryAccessToken(accessToken); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String access_Token = ""; //過期 // System.out.println("當前時間戳:"+new Date().getTime()); // System.out.println("上一次時間戳:"+sdf.parse(accessToken.getCreateTime()).getTime()); // System.out.println("時間差:"+(new Date().getTime() - sdf.parse(accessToken.getCreateTime()).getTime())/1000); // System.out.println("有效時間:"+Long.valueOf(accessToken.getExpiresIn())); if(accessToken != null){ if((new Date().getTime() - sdf.parse(accessToken.getCreateTime()).getTime())/1000 > Long.valueOf(accessToken.getExpiresIn())){ accessToken.setAccessToken(getAccessToken().getAccess_token()); accessToken.setExpiresIn(String.valueOf(getAccessToken().getExpires_in())); accessToken.setCreateTime(DateUtil.getDateFormatBySS(new Date())); socketOperate.meetingDao.updateAccessToken(accessToken); } access_Token = accessToken.getAccessToken(); }else{ AccessTokenDto at = new AccessTokenDto(); at.setAccessToken(getAccessToken().getAccess_token()); at.setExpiresIn(String.valueOf(getAccessToken().getExpires_in())); at.setCreateTime(DateUtil.getDateFormatBySS(new Date())); socketOperate.meetingDao.insertAccessToken(at); access_Token = at.getAccessToken(); } return access_Token; } public static AccessToken getAccessToken(){ AccessToken accessToken = null; Map<String, String> params = new TreeMap<String, String>(); params.put("appid", WechatConfig.APP_ID); params.put("secret", WechatConfig.APP_SECRET); String jsonResult = HttpReqUtil.HttpDefaultExecute(SystemConstant.GET_METHOD, WechatConfig.ACCESS_TOKEN, params, "", null); accessToken = JsonUtil.fromJsonString(jsonResult, AccessToken.class); return accessToken; } public static MeetingInfoDto getCloseTime() throws Exception{ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); long diffTime = 0; long nowTime = new Date().getTime(); MeetingInfoDto model = new MeetingInfoDto(); model.setIsDeleted(10); List<MeetingInfoDto> meetings = socketOperate.meetingDao.queryMeeting(model); if(meetings.size() > 0){ diffTime = Math.abs(sdf.parse(meetings.get(0).getStartTime()).getTime() - nowTime); model = meetings.get(0); } for(MeetingInfoDto bean : meetings){ if(diffTime > Math.abs(sdf.parse(bean.getStartTime()).getTime() - nowTime)){ diffTime = Math.abs(sdf.parse(bean.getStartTime()).getTime() - nowTime); System.out.println(diffTime); model = bean; } } System.out.println("會議名稱:"+model.getTitle()); return model; } public static void main(String[] args) { String arg = "0900ee0000800183929277333"; if(arg.indexOf("0008") != -1){ if("00".equals(arg.substring(2, 4))){ System.out.println(arg = arg.substring(arg.indexOf("00008"), arg.indexOf("00008")+8)); System.out.println("執行簽到操作"); }else if("01".equals(arg.substring(2, 4))){ System.out.println("執行通知操作"); System.out.println(arg = arg.substring(arg.indexOf("00008"), arg.indexOf("00008")+8)); } } } }
web.xml配置如下:
<!--
<context-param> <param-name>socketPort</param-name> <param-value>6000</param-value> </context-param>
--> <listener> <description>Socket服務隨web啟動而啟動</description> <listener-class>SocketServiceLoader.java路徑</listener-class> </listener>