ネッティービルド-springバージョン

ネッティーはSpringbootにサービスに建てられました

実現のソケット通信

記事のスレッドバージョンの別の部分を見てください

スプリング@Component 1.網状サービスは、容器に注ぎ

@PostConstructと@PreDestroyは、これらの注釈は、非静的ボイド()メソッドを変更するために使用されます。

あなたはサーブレットサーバをロードするときにメソッドの実行を変更することが@PostConstruct、およびサーバが一度だけ実行されます。

@PostConstructコンストラクタと、init()の実行前に方法を実行した後。

破壊()メソッドが実行された後@PreDestroyを行います。

URL:127.0.0.1、ポート:7000、自身の持ちます

輸入java.net.InetSocketAddress;

輸入org.apache.log4j.Logger;
輸入org.springframework.beans.factory.annotation.Autowired;
輸入org.springframework.beans.factory.annotation.Value; 輸入org.springframework.stereotype.Component;
 輸入io.netty.bootstrap.ServerBootstrap; 輸入io.netty.channel.Channel; 輸入io.netty.channel.ChannelFuture; 輸入io.netty.channel.ChannelOption; 輸入io.netty.channel.EventLoopGroup; 輸入io.netty.channel.nio.NioEventLoopGroup; 輸入io.netty.channel.socket.nio.NioServerSocketChannel; 輸入javax.annotation.PostConstruct; 輸入javax.annotation.PreDestroy。/ ** *初始化* @author ZQ * / @ComponentパブリッククラスNettyServer {プライベート静的最終ロガーロガー= Logger.getLogger(NettyServer.class )。@value( "$ {netty.url}" プライベート文字列のURL; // IP地址@value( "$ {netty.port}" プライベートint型ポート; //端口号@Autowired ServerChannelInitializer serverChannelInitializer; //は、/ ** * NioEventLoopない2 NioEventLoopGroupの作成に加えて、I / Oに加えて、読み書きを担当して、純粋なI / Oスレッド、*実際には2つの別々の反応器であるチャンネルを初期化しますスレッドプール。I / Oが読ん他のプロセスのための*クライアントTCP接続を受信するための手段とに関連する書き込み操作、またはタスク実行システム、などのタスクタイマータスク。* / //クライアント接続スレッド決勝EventLoopGroup bossGroup =新しい新しいプライベート受信するための責任NioEventLoopGroup(を); // I /イベントO、タスクのタスク・モニター・タスクフォース最終EventLoopGroup workerGroup =新しい新しいプライベート・クライアントの処理を担当NioEventLoopGroup();プライベートチャンネルチャンネル; @PostConstructます。public void スタート(){試み{=新しい新しいアドレスたInetSocketAddress たInetSocketAddress(URL、ポート); // NIOは、ブートストラップ= ServerBootstrapの新しい新しいクラス上の援助やサービス開始スタート)ServerBootstrapのを(グループ(bossGroup、workerGroup);. //チャネル構成をbootstrap.channel(NioServerSocketChannel.class); Bootstrap.localAddress(アドレス); bootstrap.childHandler (serverChannelInitializer); //バックログサーバーソケットServerSocketオブジェクト用に構成、要求処理スレッドがいっぱいになったとき//キューのサイズ、サーバ識別を設定し、一時的に記憶するためこれは、3ウェイハンドシェイク要求bootstrap.optionにキュー(ChannelOption.SO_BACKLOG、1024年の最大の長さを完了した); // 2時間、TCP内のキープアライブメカニズムが有効になっているハートビート、無通信データが自動的にデータパケット・アクティビティ・プローブを送信する場合bootstrap.childOption(trueにChannelOption.SO_KEEPALIVE、); //バインド着信接続の受信を開始するポート=フューチャーChannelFuture bootstrap.bind(アドレス).sync(); System.out.printlnは( "ネッティーサービスリスニングポート:" + address.getPort()); future.channel()closeFuture()同期(); ...}キャッチ(例外e){e.printStackTrace();}最後に{//閉じるメインスレッドグループbossGroup.shutdownGracefully(); / /クローズスレッドグループworkerGroup.shutdownGracefully();}} / ** * * /ストップ・サービス@PreDestroyます。public void(){logger.info( "シャットダウンネッティーサーバー..."破壊します); IF(!チャネル= NULL ){channel.close()。} bossGroup.shutdownGracefully()。workerGroup.shutdownGracefully(); logger.info( "シャットダウンネッティーサーバー成功!" ); }}

 

2.チャネルの初期化

。channel.pipeline()addLast( "デコーダ "、新StringDecoder(CharsetUtil.UTF_8)); // フォーマット復号
channel.pipelineを()addLast( "エンコーダ" 、新StringEncoder(CharsetUtil.UTF_8));. // コーディングフォーマット
文字列メッセージがフォーマットを符号化および復号化の両方利用可能である場合、
ここでIは手動でデコードするために、ハードウェア及び通信機器です。
輸入io.netty.channel.ChannelInitializer;
輸入io.netty.channel.socket.SocketChannel;
輸入io.netty.handler.codec.string.StringDecoder;
輸入io.netty.handler.codec.string.StringEncoder; 輸入io.netty.util.CharsetUtil; 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Component; / ** *初始化* @author ZQ * / @ComponentパブリッククラスServerChannelInitializerが延びるChannelInitializer <たSocketChannel> {@Autowired ServerHandler serverHandler。@OverrideボイドinitChannel(のSocketChannelチャネル)がスロー保護例外{//加密//channel.pipeline().addLast("decoder」、新しいStringDecoder(CharsetUtil.UTF_8を)); //解码格式//channel.pipeline()。 addLast( "エンコーダ"、新StringEncoder(CharsetUtil.UTF_8)); //编码格式channel.pipeline()addLast(S erverHandler)。}}

3.サービス処理

処理データ(バイト配列)は、クライアントによって送信されます

輸入java.util.Map;

輸入com.bls.blsapplicationsocket.common.dict.ConstXml;
輸入io.netty.channel.ChannelHandler;
輸入io.netty.channel.group.ChannelGroup; 輸入io.netty.channel.group.DefaultChannelGroup; 輸入io.netty.util.concurrent.GlobalEventExecutor; 輸入org.apache.log4j.Logger; 輸入com.bls.blsapplicationsocket.common.utils.ParseDataUtil; 輸入com.bls.blsapplicationsocket.common.utils.ByteConver; 輸入com.bls.blsapplicationsocket.common.utils.RequestUtil; 輸入com.bls.blsapplicationsocket.common.utils.ResponseUtil; 輸入com.bls.blsapplicationsocket.common.utils.XmlUtil; 輸入io.netty.buffer.ByteBuf; 輸入io.netty.channel.ChannelHandlerContext; 輸入io.netty.channel.ChannelInboundHandlerAdapter; 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Component; / ** *ネッティー服务端处理器* * @author ZQ ** /@Component @ ChannelHandler.SharableパブリッククラスServerHandlerは延びChannelInboundHandlerAdapter {プライベート静的最終ロガーロガー= Logger.getLogger(ServerHandler.classします)。@Autowired ParseDataUtil parseDataUtil。/ ** *所有的活动用户* /プライベート静的のチャネル・グループ・グループ=新しいDefaultChannelGroup(GlobalEventExecutor.INSTANCE)。@Override公共ボイドchannelActive(ChannelHandlerContext CTX)スロー例外{のSystem.out.println(ctx.channel()。[リモート()+ "----->连接触发----->" + ctx.channel() .ID())。スーパー.channelActive(CTX); group.add(ctx.channel())。} @Override公共ボイドchannelInactive(ChannelHandlerContext CTX)がスロー例外{のSystem.out.println(ctx.channel()。[リモート()+ "----->断开连接----->" + ctx.channelを()))(.ID。.channelInactive(CTX); group.remove(ctx.channel ());} / ** * クライアント・メッセージ・トリガ、各着信メッセージは、* /呼び出す必要@Override公共ボイドchannelRead(ChannelHandlerContext CTX、オブジェクトMSG)スロー例外{[リモートのSystem.out.printlnを()(+ ctx.channel( "IPチャネルが受信") + " メッセージ送信しました。" ); ByteBuf msgByteBuf = (ByteBuf)MSG;バイト[] = BYTEARRAYバイト新しい新規[msgByteBuf.readableBytes()]; msgByteBuf.readBytes(BYTEARRAYザ); 
     //バイト配列データを処理
} / ** *スロー/発生公共ボイドexceptionCaught @Override(CTX ChannelHandlerContextは、原因のThrowableである)スロー例外{原因であるが。 printStackTrace(); ctx.close(); }}

ここでは、バイト配列を解析添付4

最初の10ビットは、シーケンス番号+ヘッダ+コンテンツ長さ

トレーラー4された後、

10からは、最後のビット4まで、データの内容が必要とされています

  / **
     *クライアントを解決するための情報を送り返します
     * 
     * @Param MSG
     * @return
     * /
    パブリック静的文字列メッセージ(オブジェクトMSG){
        してみてください{
            //解析するXMLのxml長さを取得
            バイト[]サイズ=新しいバイト[4 ]。
            System.arraycopyの(MSG、10、サイズ、0、4 )。 INT LEN = ByteConver.Bytes2Int_LE(サイズ)。
 // XMLに沿った長さの配列を作成 バイト[]新しい新しいXMLバイト= [LEN]; //はSystem.arraycopyの(MSG、14、XML、0 XML解析戻り、レン);戻り新しい新しい文字列(XML、 "UTF-8" );}キャッチ(例外E){e.printStackTrace();}戻りNULL ;}

 

おすすめ

転載: www.cnblogs.com/zq33312757/p/11837462.html