這篇文章主要介紹了javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)松桃免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
說(shuō)明:在javaweb項(xiàng)目啟動(dòng)的時(shí)候啟動(dòng)socket服務(wù)端,可以接受客戶(hù)端發(fā)送過(guò)來(lái)的數(shù)據(jù),客戶(hù)端可以反復(fù)斷開(kāi)連接
1.新建SocketThread線(xiàn)程類(lèi)
package com.wlw.modules.startImplement.web; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * socket 線(xiàn)程類(lèi) * @Author: zhouhe * @Date: 2019/4/16 14:58 */ public class SocketThread extends Thread { private ServerSocket serverSocket = null; public SocketThread(ServerSocket serverScoket){ try { if(null == serverSocket){ this.serverSocket = new ServerSocket(8877); System.out.println("socket start"); } } catch (Exception e) { System.out.println("SocketThread創(chuàng)建socket服務(wù)出錯(cuò)"); e.printStackTrace(); } } public void run(){ while(!this.isInterrupted()){ try { Socket socket = serverSocket.accept(); if(null != socket && !socket.isClosed()){ //處理接受的數(shù)據(jù) new SocketOperate(socket).start(); } // socket.setSoTimeout(30000); //設(shè)置超時(shí) }catch (Exception e) { } } } public void closeSocketServer(){ try { if(null!=serverSocket && !serverSocket.isClosed()) { serverSocket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.新建SocketOperate,用于接受客戶(hù)端傳來(lái)的數(shù)據(jù)
package com.wlw.modules.startImplement.web; import com.wlw.modules.lhjh.socket.tstandard.MessageParsing; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; /** * 多線(xiàn)程處理socket接收的數(shù)據(jù) * @Author: zhouhe * @Date: 2019/4/16 14:59 */ public class SocketOperate extends Thread { private Socket socket; public SocketOperate(Socket socket) { this.socket=socket; } @Override public void run() { try { //封裝輸入流(接收客戶(hù)端的流) BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); DataInputStream dis = new DataInputStream(bis); byte[] bytes = new byte[1]; // 一次讀取一個(gè)byte String ret = ""; while (dis.read(bytes) != -1) { ret += MessageParsing.bytesToHexString(bytes) + ""; if (dis.available() == 0) { //一個(gè)請(qǐng)求 System.out.println("轉(zhuǎn)換為字符串后:"+MessageParsing.hexStringToString(ret)); System.out.println("轉(zhuǎn)為map后的數(shù)據(jù):"+MessageParsing.stringToMap(MessageParsing.hexStringToString(ret))); ret = ""; } } } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("client is over"); if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3.新建InitJob,web項(xiàng)目啟動(dòng)的時(shí)候會(huì)執(zhí)行里面的方法,去啟動(dòng)socket,可以用串口調(diào)試工具測(cè)試
package com.wlw.modules.startImplement.web; import com.wlw.common.config.Global; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * @Author: zhouhe * @Date: 2019/4/16 11:00 */ //創(chuàng)建的類(lèi)名根據(jù)需要定義,但一定要實(shí)現(xiàn)ServletContextListener接口 public class InitJob implements ServletContextListener { //socket server 線(xiàn)程 private SocketThread socketThread; /** * 項(xiàng)目在啟動(dòng)初始化的時(shí)候就會(huì)執(zhí)行的方法(啟動(dòng)服務(wù)時(shí)執(zhí)行) * @param arg0 */ @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub //這里可以放你要執(zhí)行的代碼或方法 if(null==socketThread && "yes".equals(Global.getConfig("socket"))){ // MessageParsing.calculation(); //新建線(xiàn)程類(lèi) socketThread=new SocketThread(null); //啟動(dòng)線(xiàn)程 socketThread.start(); } } /** *contextDestroyed是在消亡的時(shí)候執(zhí)行的方法(關(guān)閉服務(wù)時(shí)執(zhí)行) * @param arg0 */ @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub if(null!=socketThread && !socketThread.isInterrupted()){ socketThread.closeSocketServer(); socketThread.interrupt(); } } }
4.這里需要一個(gè)報(bào)文解析工具類(lèi)
package com.wlw.modules.lhjh.socket.tstandard; import java.util.HashMap; import java.util.Map; /** * HJ/T212 報(bào)文解析 * @Author: zhouhe * @Date: 2019/4/12 10:11 */ public class MessageParsing { /** * 字符串轉(zhuǎn)換為 map * @param arr * @return */ public static Map stringToMap(String arr){ arr=arr.replaceAll(",",";"); Map map = new HashMap(); if (null != arr) { String[] param = arr.split(";"); for (int i = 0; i < param.length; i++) { //這里的 index 要 >-1 才是 map格式 int index = param[i].indexOf('='); if(index>-1) map.put(param[i].substring(0,index), param[i].substring((index + 1))); } } return map; } /** * byte[]數(shù)組轉(zhuǎn)換為16進(jìn)制的字符串 * * @param bytes 要轉(zhuǎn)換的字節(jié)數(shù)組 * @return 轉(zhuǎn)換后的結(jié)果 */ public static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); } /** * 16進(jìn)制轉(zhuǎn)換成為string類(lèi)型字符串 * 這個(gè)方法中文會(huì)亂碼,字母和數(shù)字都不會(huì)亂碼 * * @Author zhouhe * @param s * @return */ public static String hexStringToString(String s) { if (s == null || s.equals("")) { return null; } s = s.replace(" ", ""); byte[] baKeyword = new byte[s.length() / 2]; for (int i = 0; i < baKeyword.length; i++) { try { baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); } catch (Exception e) { e.printStackTrace(); } } try { s = new String(baKeyword, "UTF-8"); new String(); } catch (Exception e1) { e1.printStackTrace(); } return s; } }
這樣就大功告成了,啟動(dòng)web項(xiàng)目,就可以接受客戶(hù)端過(guò)來(lái)的數(shù)據(jù)了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
文章名稱(chēng):javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn)
標(biāo)題URL:http://jinyejixie.com/article16/gdpcgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站制作、標(biāo)簽優(yōu)化、全網(wǎng)營(yíng)銷(xiāo)推廣、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)