博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
netty-客户端.channel()方法 源码分析.md
阅读量:6232 次
发布时间:2019-06-22

本文共 4732 字,大约阅读时间需要 15 分钟。

应用程序代码

官方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
() { @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, 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
channelClass) { if (channelClass == null) { throw new NullPointerException("channelClass"); } return channelFactory(new ReflectiveChannelFactory
(channelClass)); //? } /** * @deprecated Use {@link #channelFactory(io.netty.channel.ChannelFactory)} instead. */ @Deprecated public B channelFactory(ChannelFactory
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

你可能感兴趣的文章
微信公众号实现回复图文消息
查看>>
单点登录方案的比较和选择
查看>>
Android 涂鸦最佳实践
查看>>
Paste Deployment
查看>>
Ubuntu 解压错误
查看>>
eclipse项目(project)出现感叹号的一种处理办法
查看>>
CCSpawn 同步动作
查看>>
Gexmul虚拟机内存空间原理简述
查看>>
java--文件统计
查看>>
解决Oracle10修改机器名后oracledbconsoleorcl服务无法启动的问题
查看>>
IOS API中的“错误”
查看>>
PHP_常用正则资料
查看>>
java通过JDBC链接mysql报错解决办法
查看>>
猎豹浏览器抢票功能遭屏蔽 要“约谈”12306
查看>>
java&android线程池-Executor框架之ThreadPoolExcutor&ScheduledThreadPoolExecutor浅析(多线程编程之三)...
查看>>
Spark的JavaWordCount例子
查看>>
知乎上小米变相约瑟夫环面试题微软解法的py代码
查看>>
快速排序
查看>>
提升应用视觉Android效果的10个UI技巧
查看>>
[接口已更新]免费天气预报API-六天/实时-中国天气网
查看>>