説明:プロジェクトが始まったときにソケットサーバーjavawebを開始し、クライアントから送信されたデータを受け入れることができ、クライアントが繰り返し切断することができます
1.新しいスレッドクラスを作成しますSocketThread
パッケージcom.wlw.modules.startImplement.web; インポートにjava.io.IOException; 輸入java.net.ServerSocket。 インポートのjava.net.Socket; / ** *ソケット线程类 * @Author:zhouhe * @Date:2019年4月16日午前14時58分 * / パブリック クラス SocketThreadが拡張スレッドを{ プライベートのServerSocket ServerSocketを= nullを。 公共SocketThread(ServerSocketをserverScoket){ しようと{ 場合(ヌル == ServerSocketを){ この .serverSocket = 新しいですServerSocketを(8877 )。 System.out.println( "ソケットスタート" ); } } キャッチ(例外e){ System.out.printlnは( "SocketThread创建ソケット服务出错" )。 e.printStackTrace(); } } 公共 ボイドラン(){ 中(!この.isInterrupted()){ 試み{ ソケットソケット = serverSocket.accept(); もし(ヌル!=ソケット&&!socket.isClosed()){ //处理接受的数据 新しいSocketOperate(ソケット).start(); } // socket.setSoTimeout(30000)。 // 设置超时 } キャッチ(例外e){ } } } 公共 ボイドcloseSocketServer(){ しようと{ 場合(ヌル = ServerSocketを&&!serverSocket.isClosed()) { serverSocket.close(); } } キャッチ(IOExceptionを電子){ // TODO自動生成されたcatchブロック e.printStackTrace(); } } }
2.クライアントからのデータを受信するための、SocketOperateを作成します。
パッケージcom.wlw.modules.startImplement.web; 輸入com.wlw.modules.lhjh.socket.tstandard.MessageParsing。 輸入java.io.BufferedInputStreamの。 インポートにjava.io.DataInputStream; インポートにjava.io.IOException; インポートのjava.net.Socket; / ** *多线程处理ソケット接收的数据 * @Author:zhouhe * @Date:2019年4月16日14時59分 * / パブリック クラス SocketOperateが拡張スレッド{ プライベートソケットソケットを、 公共SocketOperate(ソケットソケット){ この .socket = ソケット。 } @Override 公共 無効RUN(){ 試み{ // パッケージの入力ストリーム(ストリームが受信クライアント) にBufferedInputStream BIS = 新しい新しいBufferedInputStreamを(Socket.getInputStream()); DataInputStreamをDIS = 新しい新しいDataInputStreamを(BIS); バイト []バイト= 新しい新しい バイト [1。 ]; //は、1つのバイトの読み取り 文字列RETを = "" ; ながら(!dis.read(バイト)= -1 ){ RET + = MessageParsing.bytesToHexString(バイト)+ "" ; IF(dis.available()== 0){ // 要求 するSystem.out.println( "文字列に変換する:" + MessageParsing.hexStringToString(RET)); のSystem.out.println(「マップを回転した後データ: "+ MessageParsing.stringToMap(MessageParsing.hexStringToString(RET))); RET =" " ; } } } キャッチ(例外E){ e.printStackTrace(); } 最後に、{ のSystem.out.println(オーバー"クライアントであります" ); IF(ソケット!= NULL ){ 試す{ )(socket.close。 } キャッチ(IOExceptionを電子){ e.printStackTrace(); } } } } }
Webプロジェクトは、メソッド内で開始3.新InitJobは、ソケットを開始するために、実行され、シリアルデバッグツールをテストするために使用することができます
パッケージcom.wlw.modules.startImplement.web; インポートcom.wlw.common.config.Global; インポートれるjavax.servlet.ServletContextEvent; インポートjavax.servlet.ServletContextListener; / ** * @author:zhouhe * @date:2019 / 4/16 11:00 * / // ニーズの定義に従って作成したクラス名が、我々は、インタフェースのServletContextListener実装しなければならない 公共の クラスを InitJob 実装のServletContextListener { // ソケットサーバースレッド プライベートSocketThread socketThread; / ** 時間*プロジェクトが初期化を開始しますこの方法は、(実行開始サービス)が実行されます * @paramのarg0に * / @Override 公衆 空contextInitialized(ServletContextEventのarg0){ // TODO自動生成方法、スタブ // ここにあなたがコードや実行したい方法で置くことができます IF(ヌル == socketThread &&「はい」.equals(Global.getConfig(「ソケット」))) { // MessageParsing.calculation(); // 新しいスレッドクラス socketThread = 新しい新しい socketThread(NULL ); // スレッドを開始 socketThread.start(); } } / ** *は、(閉じるサービスcontextDestroyedの終焉で実行される方法でありますときに実行) * @param arg0に * / @Override 公共 ボイドcontextDestroyed(ServletContextEvent arg0に){ // TODO自動生成方法スタブ 場合(ヌル = socketThread &&!socketThread.isInterrupted()){ socketThread.closeSocketServer()。 socketThread.interrupt(); } } }
4.これは、パケットベースの解析ツールでなければなりません
パッケージcom.wlw.modules.lhjh.socket.tstandard。 輸入java.util.HashMapを; 輸入java.util.Map; / ** * HJ / T212报文解析 * @Author:zhouhe * @Date:2019年4月12日午前10時11分 * / パブリック クラスMessageParsing { / ** *字符串转换为マップ * @paramのARRの *の@return * / パブリック 静的地図stringToMap(文字列ARR){ ARR = arr.replaceAll( " "";" ); 地図・マップ = 新しいHashMapの(); もし(ヌル!=ARR){ 文字列[] PARAM = arr.split( ";" ); のため(int型 I = 0;私は<param.length; Iは++ ){ // インデックスが本明細書中で> -1形式であるマップ int型のインデックス= PARAM [I] .indexOf( '=' ); IF(指数> -1 ) map.put(PARAM [I] .substring( 0、インデックス)、PARAMの[I] .substring((インデックス+ 1 ))); } } 戻り地図; } / ** *バイト[]配列は、16進文字列に変換される * * @paramに変換されるバイトのバイト配列 * @return変換結果 * / パブリック 静的文字列bytesToHexString(バイト[]バイト)は{ StringBuilderのSB = 新しい新規のStringBuilder()は、 のために(int型 I = 0; I <bytes.length; I ++は){ 文字列ヘクス = Integer.toHexString(0xFFで&バイト[I]); IF(hex.length()== 1 ){ sb.append( '0' ); } sb.append(16進); } 戻りsb.toStringを(); } / ** * 16に変換され製造された文字列の文字列型 *このメソッド中国人が文字化けされ、文字と数字が文字化けしません * * @Author zhouhe * @param S * @return * / パブリック 静的文字列hexStringToString(文字列S){ もし、(S ==のヌル || s.equals( "" )){ 戻り ヌル。 } 、S = s.replace(」」、 "" ); バイト [] baKeyword = 新しい バイト [s.length()/ 2 ]。 用(int型、iがbaKeyword.lengthを<; iが0 =私は++ ){ 試みる { [I] baKeywordを =(バイト)(0xffの&Integer.parseIntは(s.substring(i)はiは2 + 2 *、2 * 16 ))。 } キャッチ(例外e){ e.printStackTrace(); } } 試みる{ S = 新しい文字列(baKeyword、 "UTF-8" )。 新しい文字列(); } キャッチ(例外E1){ e1.printStackTrace()。 } 戻りS。 } }
それはそれだ、Webプロジェクトを開始し、クライアントは、以上のデータを受け入れることができます