Nettyフレームワークの学習経験初級編---helloworld


どのプログラム猿もhelloworldに特別な感情を持っています!
私の勉強もhelloworldコードから始まりました.最初はpdf版のnetty権威ガイドをダウンロードしました.この本はnetty 5です.0バージョンではnetty.ioは、このバージョンが廃棄されたか、それとも3.xと4.xですが、4~5の差は大きくないと思います.それから本の例を真似て始めました.結局、詰まってしまいました.5.0バージョンの方法は4です.xバージョンには入っていないか、改名したか、改名しても同じバッグに入っていないので、目がくらみますね.思い切ってあきらめる.2冊目の本nettyチュートリアル、これは3.xバージョンですが、原作者の探究経験の整理で、比較的乱れていて、しかも3.xと4.xバージョンの違いは大きいです.4.xは多くの問題を解決し、より合理的である.放棄3.xバージョン.進軍するつもりです.x.果敢に大神がいるのはもう正しい.xバージョンのエントリーレベルは、後者の学習のために整理されています.思い切って見て、時空のドアをください.http://www.cnblogs.com/zou90512/p/3492287.html
学習を経て、nettyの運行方法を大体理解して、serverとclientを構築することに成功しましたが、clientは使用していません.私が直面しているのはハードウェア設備のclientで、その内容は修正できないので、clientを無視します.詳細なコードについては、上記の転送ゲートを自分で確認してください.
ここで重要なのはデコーダです.
じょうふごう
package com.netty.demo2;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class HelloServerInitializer extends ChannelInitializer{

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        //  ("
") // pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); // pipeline.addLast("decoder", new StringDecoder());// pipeline.addLast("encoder", new StringEncoder());// pipeline.addLast("bytesDecoder",new ByteArrayDecoder()); pipeline.addLast("bytesEncoder",new ByteArrayEncoder()); // Handler pipeline.addLast("handler", new HelloServerHandler()); } }
まず
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
これはセパレータベースのデコーダで、私たちは迂回することができますが、実はこれは必要ありません.私が直面しているハードウェアデバイスが送信できないときに「」を持っているからです.
後ろのStringDecoder、StringEncoderはstring文字列のデコーダとエンコーダで、送信しないことを受信するだけであれば、デコーダをロードするだけでいいので、エンコーダはロードする必要はありません.もう一度言ってみろaddLast(String name,ChannelHandler handler)という関数は、最初は
 pipeline.addLast("decoder", new StringDecoder());//  
の「decoder」はデフォルトで、デコーダがこの文字列である限り、ByteArrayDecoderとByteArrayEncoderバイトデエンコーダをロードするときも、この2つの文字列「decoder」と「encoder」に沿ってhelloserverを起動することに成功しましたが、デバイス接続がタイムズに間違っていると、ここのnameは同じではないことに気づきました.そこでソースを
/**
     * Appends a {@link ChannelHandler} at the last position of this pipeline.
     *
     * @param name     the name of the handler to append
     * @param handler  the handler to append
     *
     * @throws IllegalArgumentException
     *         if there's an entry with the same name already in the pipeline
     * @throws NullPointerException
     *         if the specified handler is {@code null}
     */
    ChannelPipeline addLast(String name, ChannelHandler handler);
本当にそうですね.よくわかりました.名前だけです.
したがって、この問題は、他のフォーマットを送信するデータを他の受信する必要がある場合、復号エンコーダを自分でロードすることができることを解決します.また、メッセージの送受信は、最後のaddLastでのみ行われるか、または実行される理由について説明する.なぜなら、データの伝送方向は、データがサービス側に入ると、上から各デエンコーダを経てInboundHandlerを同時に検索し、inboundhandlerでは受信メッセージを処理する論理内容であり、同様に、メッセージがサービス側からクライアントに送信されると逆方向に動作し、それに対応するoutboundhandlerを検索するからである.さらにHelloServerHandlerでSimpleChannelInboundHandlerを継承し,channelRead 0とchannelActiveメソッドを上書きすることでメッセージの送受信が可能となった.
次に解決するのはマルチクライアントの問題です!
プログラミングが好きで、勉強が好きで、挑戦が好きです.
プログラム猿は私で、私はプログラム猿です.