ソケットサーバの起動時間javawebを開始

説明:プロジェクトが始まったときにソケットサーバー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プロジェクトを開始し、クライアントは、以上のデータを受け入れることができます

おすすめ

転載: www.cnblogs.com/zhouheblog/p/11245833.html