当前位置: 首页 > news >正文

netty-客户端.channel()方法 源码分析.md

应用程序代码

官方demo

/*

 * Copyright 2012 The Netty Project

 *

 * The Netty Project licenses this file to you under the Apache License,

 * version 2.0 (the "License"); you may not use this file except in compliance

 * with the License. You may obtain a copy of the License at:

 *

 *   http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

 * License for the specific language governing permissions and limitations

 * under the License.

 */

package io.netty.example.echo;



import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.ChannelPipeline;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

import io.netty.handler.ssl.SslContext;

import io.netty.handler.ssl.SslContextBuilder;

import io.netty.handler.ssl.util.InsecureTrustManagerFactory;



/**

 * Sends one message when a connection is open and echoes back any received

 * data to the server.  Simply put, the echo client initiates the ping-pong

 * traffic between the echo client and server by sending the first message to

 * the server.

 */

public final class EchoClient {



    static final boolean SSL = System.getProperty("ssl") != null;

    static final String HOST = System.getProperty("host", "127.0.0.1");

    static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));

    static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));



    public static void main(String[] args) throws Exception {

        // Configure SSL.git

        final SslContext sslCtx;

        if (SSL) {

            sslCtx = SslContextBuilder.forClient()

                .trustManager(InsecureTrustManagerFactory.INSTANCE).build();

        } else {

            sslCtx = null;

        }



        // Configure the client.

        EventLoopGroup group = new NioEventLoopGroup();

        try {

            Bootstrap b = new Bootstrap();

            b.group(group)

             .channel(NioSocketChannel.class) //设置通道类 只是设置了通道对象 啥没没做

             .option(ChannelOption.TCP_NODELAY, true)

             .handler(new ChannelInitializer<SocketChannel>() {

                 @Override

                 public void initChannel(SocketChannel ch) throws Exception {

                     ChannelPipeline p = ch.pipeline();

                     if (sslCtx != null) {

                         p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));

                     }

                     //p.addLast(new LoggingHandler(LogLevel.INFO));

                     p.addLast(new EchoClientHandler());

                 }

             });



            // Start the client.

            ChannelFuture f = b.connect(HOST, PORT).sync();



            // Wait until the connection is closed.

            f.channel().closeFuture().sync();

        } finally {

            // Shut down the event loop to terminate all threads.

            group.shutdownGracefully();

        }

    }

}


复制代码

netty源码

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {




/**

     * The {@link Class} which is used to create {@link Channel} instances from.

     * You either use this or {@link #channelFactory(io.netty.channel.ChannelFactory)} if your

     * {@link Channel} implementation has no no-args constructor.

     */

    public B channel(Class<? extends C> channelClass) {

        if (channelClass == null) {

            throw new NullPointerException("channelClass");

        }

        return channelFactory(new ReflectiveChannelFactory<C>(channelClass)); //?

    }


 /**

     * @deprecated Use {@link #channelFactory(io.netty.channel.ChannelFactory)} instead.

     */

    @Deprecated

    public B channelFactory(ChannelFactory<? extends C> channelFactory) {

        if (channelFactory == null) {

            throw new NullPointerException("channelFactory");

        }

        if (this.channelFactory != null) {

            throw new IllegalStateException("channelFactory set already");

        }



        this.channelFactory = channelFactory; //主要是设置通道工厂类

        return self();

    }



@SuppressWarnings("unchecked")

    private B self() {

        return (B) this; //返回值就是启动类本身

    }


复制代码

和nio channel区别?

一样 封装了一下nio

通道channel到底指什么?

java网络通信 有2套机制
1.java.net.socket
2.java.nio.channel

相同点 都是表示一个连接 服务器和客户端的连接 但是网络编程里并不真正存在连接这个对象 jdbc里存在连接对象

不同点 首先 1.它们是互相独立的 之间没有任何关系 是java网络通信的2套解决方案 2.1是同步阻塞 2是异步非阻塞 异步非阻塞 可以提高网络通信的性能 就是不要一直卡在那里 等在那里 等就是浪费时间 异步就是连接之间互不影响 自己干自己的事情

转载于:https://juejin.im/post/5c5418c3518825627c389d43

相关文章:

  • Java 多线程编程之:notify 和 wait 用法
  • django之配置静态文件
  • 区块链多币种测试网络钱包(开源)
  • 滴滴出行基于RocketMQ构建企业级消息队列服务的实践
  • TypeScript实现数据结构(一)栈,队列,链表
  • 阿里云移动端播放器高级功能介绍
  • CentOS 7 防火墙操作
  • React-flux杂记
  • Computed property XXX was assigned to but it has no setter
  • 阿里云服务器如何修改远程端口?
  • go的基本知识
  • extract-text-webpack-plugin用法
  • 《从0开始学Elasticsearch》—初识Elasticsearch
  • vue 打包 以及跨域问题组织
  • 深入了解以太坊
  • 【翻译】babel对TC39装饰器草案的实现
  • HTTP--网络协议分层,http历史(二)
  • IDEA 插件开发入门教程
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript实现分页效果
  • Logstash 参考指南(目录)
  • Making An Indicator With Pure CSS
  • PhantomJS 安装
  • python_bomb----数据类型总结
  • webpack入门学习手记(二)
  • 给Prometheus造假数据的方法
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 微信小程序:实现悬浮返回和分享按钮
  • 智能合约Solidity教程-事件和日志(一)
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • (2022 CVPR) Unbiased Teacher v2
  • (3)(3.5) 遥测无线电区域条例
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)windows配置JDK环境
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (四)Linux Shell编程——输入输出重定向
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转载)hibernate缓存
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net 无限分类
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • []C/C++读取串口接收到的数据程序
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [CF494C]Helping People
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [hdu 1711] Number Sequence [kmp]