記事のディレクトリ
A.スタートサーバプロセス分析
1.四つの必須属性
単純なサーバールックスからデモ
- NIOServer
public class NIOServer {
public static void main(String[] args) {
ServerBootstrap serverBootstrap = new ServerBootstrap(); // 启动引导器
NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // 监听组
NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // 工作组
serverBootstrap.group(bossGroup, workerGroup) // 指定线程模型:监听组和工作组
.channel(NioServerSocketChannel.class) // IO模型:NIO模式
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
// 初始化channel:连接后的读写逻辑
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
System.out.println(String.format("服务端接收到消息:%s", msg));
}
});
}
}).bind(8000); //启动端口
}
}
ネッティーサーバーを開始するには、すなわち、四つのカテゴリー必須属性を指定する必要があります。
- スレッドモデル
- IOモデル
- 読み取りおよび書き込みロジックが接続された後
- スタートポート
2.スタートガイド:serverBootstrap
すべてのサービスがスターターに登録され、設定されています。
3.スレッドモデル:bossGroupとworkerGroup
2作成したNioEventLoopGroup
2つのオブジェクトが、伝統的なIOスレッドプログラミングモデルの2つのグループとして見ることができ、bossGroup
リスニングポートを示し、accept
接続の新しいセットをスレッド、workerGroup
それはスレッドグループに読み書きするために、各データ接続を表します。接続bossGroupを受け取った後workerGroupプロセスに移動します。最後に、.group(bossGroup, workerGroup)
どこへ行くスレッドモデルを指定します。
4.IOモデル:NioServerSocketChannelとOioServerSocketChannel
.channel(NioServerSocketChannel.class)
あなたはBIOのためのIOモデルを指定したい場合はもちろん、IOモデルを指定しても、他のオプションがあり、この設定OioServerSocketChannel.class
ネッティーの利点はNIOということですので、タイプは通常、BIOスレッドモデルとして指定することはできません。
5.書き込みロジックが接続されています
.childHandler()
この方法は、このガイドのクラスを作成しChannelInitializer
、サービス処理ロジックのメインデータは、各後続の読み取りと書き込みアクセスで定義されています、。また、新しいクラスと継承を作成することができChannelInboundHandlerAdapter
ロジックを読み書きします。
6.他のガイドメソッドパラメータ
-
childHandler():、すべての接続、サービス処理ロジック汎用パラメータをChannelInitializer後続の読み取りおよび書き込みデータを作成するために、クラス定義を導くためには、接続のNioSocketChannelネッティー抽象NIOタイプでなく、NIOの接続の抽象NioServerSocketChannelタイプです
-
バインド():ChannelFutureへの非同期ChannelFutureに戻り、リスナーGenericFutureListenerを追加し、リスニングポートはoperationCompleteのGenericFutureListener成功メソッド内でバインドされています
-
childHandler():新しい接続処理を指定するには、データを読み書きするための処理ロジック、ハンドラは、()、論理サーバの起動プロセスを指定するために使用されます
-
ATTR():すなわちNioServerSocketChannelを指定カスタムマップNioServerSocketChannelを維持するために、属性channel.attrにより抽出されたサーバ側の一部を、()チャネルに属性
-
childAttr():(カスタム属性を指定するために接続された各1)が属性channel.attrによって抽出されました
-
childOption():いくつかの関連のプロパティを設定する基本的なTCP接続のそれぞれについて:
ChannelOption.SO_KEEPALIVE表示是否开启TCP底层心跳机制,true为开启 ChannelOption.SO_REUSEADDR表示端口释放后立即就可以被再次使用,因为一般来说,一个端口释放后会等待两分钟之后才能再被使用 ChannelOption.TCP_NODELAY表示是否开始Nagle算法,true表示关闭,false表示开启,通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互就开启
-
オプションは():基本的なTCPサーバーチャネルに関連するいくつかのプロパティを設定します。
ChannelOption.SO_BACKLOG表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁,服务器处理创建新连接较慢,适当调大该参数
II。クライアントの起動プロセス分析
シンプルネッティークライアントのルックスからデモ
- NIOClient
public class NIOClient {
public static void main(String[] args) throws InterruptedException {
Bootstrap bootstrap = new Bootstrap(); // 引导启动类
NioEventLoopGroup group = new NioEventLoopGroup(); // 工作组
bootstrap
.group(group) // 添加线程模型
.channel(NioSocketChannel.class) // 添加IO模型
.handler(new ChannelInitializer<SocketChannel>() {// 添加连接后的读写逻辑
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
}
});
Channel channel = bootstrap.connect("127.0.0.1", 8000).channel(); // 建立连接
while (true) {
String message = String.format("HelloWorld From %s", new SimpleDateFormat("hh:mm:ss").format(new Date()));
// 通过连接向服务端发送消息
channel.writeAndFlush(message);
Thread.sleep(2000);
}
}
}
クライアントの開始については、サービスの開始と終了は似ているが、まだプロセスを開始し、4つの主要なパラメータ、ホストポート接続にスレッドモデル、IOモデル、およびビジネス処理ロジックとの接続を必要とする次のとおりです。