Netty(2)-服务端与客户端的启动流程

Netty源码分析(一) --- Server/Client启动流程,建立连接和Read剖析 一、Netty源码分析 https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/echo 上找到echo这个example 1.1 服务端启动流程 1.1.1 两个NioEventLoopGroup 服务端代码首先要定义两个NioEventLoopGroup,打个断点进去 NioEventLoopGroup继承MultithreadEventLoopGroup,加载的时候执行父类静态方法,初始化DEFA 阅读详情

一.服务端启动流程分析

1.四大必须属性

从一个最简单的服务端Demo看起

  • 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);  //启动端口
    }
}

要启动Netty服务端,必须要指定四类必须属性,分别是:

  1. 线程模型
  2. IO模型
  3. 连接后的读写逻辑
  4. 启动端口

在这里插入图片描述

2.启动引导器:serverBootstrap

所有的服务都在启动器上进行注册和配置。

3.线程模型:bossGroup和workerGroup

创建了两个NioEventLoopGroup,这两个对象可以看做是传统IO编程模型的两大线程组,bossGroup表示监听端口,accept 新连接的线程组,workerGroup表示处理每一条连接的数据读写的线程组。bossGroup接收完连接,会交给workerGroup去处理。最后通过.group(bossGroup, workerGroup)去指定线程模型。

4.IO模型:NioServerSocketChannel和OioServerSocketChannel

通过.channel(NioServerSocketChannel.class)来指定 IO 模型,当然,这里也有其他的选择,如果你想指定 IO 模型为 BIO,那么这里配置上OioServerSocketChannel.class类型即可,通常不会指定BIO为线程模型,因为Netty的优势就在于NIO。

5.连接后读写逻辑

.childHandler()方法,给这个引导类创建一个ChannelInitializer,这里主要就是定义后续每条连接的数据读写,业务处理逻辑。也可新创建一个类并继承ChannelInboundHandlerAdapter来实现读写逻辑。

6.引导器其他方法参数
  • childHandler():给引导类创建ChannelInitializer定义后续每条连接的数据读写,业务处理逻辑,泛型参数NioSocketChannel是Netty对NIO类型的连接的抽象,而NioServerSocketChannel也是对NIO类型的连接的抽象

  • bind():异步地返回ChannelFuture,给ChannelFuture添加监听器GenericFutureListener,在GenericFutureListener的operationComplete方法里面监听端口是否绑定成功

  • childHandler():用于指定处理新连接数据的读写处理逻辑,handler()用于指定在服务端启动过程中的一些逻辑

  • attr():给服务端的channel即NioServerSocketChannel指定一些自定义属性,通过channel.attr()取出该属性,给NioServerSocketChannel维护一个map

  • childAttr():给每一条连接指定自定义属性,通过channel.attr()取出该属性

  • childOption():给每条连接设置一些TCP底层相关的属性:

       ChannelOption.SO_KEEPALIVE表示是否开启TCP底层心跳机制,true为开启
       ChannelOption.SO_REUSEADDR表示端口释放后立即就可以被再次使用,因为一般来说,一个端口释放后会等待两分钟之后才能再被使用
       ChannelOption.TCP_NODELAY表示是否开始Nagle算法,true表示关闭,false表示开启,通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互就开启
    
  • option():给服务端channel设置一些TCP底层相关的属性:

       ChannelOption.SO_BACKLOG表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁,服务器处理创建新连接较慢,适当调大该参数
    

二.客户端启动流程分析

从一个最简单的Netty客户端Demo看起

  • 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);
        }
    }
}

对于客户端的启动来说,和服务端的启动类似,依然需要线程模型、IO 模型,以及连接后业务处理逻辑和连接主机与端口,这4大参数,启动流程如下:
在这里插入图片描述

其他方法与服务端类似
Netty框架介绍并编写WebSocket服务端与客户端 阅读详情

相关推荐

netty4客户端连接多个不同的服务端

package com.tcp.server; import com.tcp.protobuf.NettyClientInitializer; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty...

zsj777的专栏 8133

二、Netty服务端/客户端启动整体流程

一、综述 Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕。所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解。从功能上,流程可以分为服务启动、建立连接、读取数据、业务处理、发送数据、关闭连接以及关闭服务。整体流程如下所示(图中没有包含关闭的部分): 二、启动流程概述 Netty服务端的启动流程如下: 启动流程大致分为五步 创建ServerBootstrap实例,ServerBootstrap是Netty服务端的启动辅助类,其存在意义在于其整合了Nett

cristianoxm的博客 2232

基于Netty实现WebSocket服务端

中,我们知道WebSocket是基于Http协议的升级,而Netty提供了Http和WebSocket Frame的编解码器和Handler,我们可以基于Netty快速实现WebSocket服务端。我们可以直接利用Netty提供了Http和WebSocket Frame的编解码器和Handler,快速启动一个WebSocket服务端。本文基于Netty实现WebSocket服务端,实现和客户端的交互通信,客户端基于JavaScript实现。一、基于Netty快速实现WebSocket服务端。

u013771019的专栏 2482

IO编程(二)NIO编程概念

注意标题.此章只是让我们对NIO有个概念,而不是让你真正的去敲或者熟悉以下代码 传统BIO编程如图1,来一个客户端连接就需要一个新的线程. 而NIO中会把新的连接注册到 selector 上,然后,通过检查这个 selector,就可以批量监测出有数据可读的连接,进而读取数据 举个例子: 幼儿园小朋友要上厕所,但是太小不会表达. BIO 一个小朋友(客户端连接)配一个老师(线程),同...

踟蹰千年的博客 322

netty服务端启动流程

说明:本文参考的 Netty 源码版本为 4.1.42.Final。 启动服务的过程中我们可以了解到 Netty 各大核心组件的关系,这将是学习 Netty 源码一个非常好的切入点,让我们一起看看 Netty 的每个零件是如何运转起来的吧。 文章目录从 Echo 服务器示例入手服务端启动全过程服务端 Channel 初始化及注册创建服务端 Channel初始化服务端 Channel注册服务端 Channel端口绑定netty服务端如何处理客户端新建连接总结 从 Echo 服务器示例入手 在这里我们实现了.

763

Netty中Channel的Attribute有什么用

Netty中Channel的Attribute有什么用

weixin_59244784的博客 1836

netty在xxl-job中的使用分析_xxljob netty-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;

求知若渴、虚心若愚 1307

Python + NX二次开发,如何配置Python的第三方库(包)?

地球人都知道python有强大的第三方库,可以各类骚操作,包括但不限于人工智能模块。在使用Python进行NX二次开发时,如果能够用得上这些第三方包,那将大大提高效率。本文详述了如何配置,实践证明:可行!

温良 1271

netty实战:SpringBoot集成netty实现客户端服务端交互

SpringBoot集成netty实现客户端服务端交互在springboot中集成netty。我在代码里用到了lombok的@data和@Slf4j注解,主要用来简化get set方法和输出日志。我们先加入netty的依赖下面是我的netty代码结构server端server启动类server初始化类server处理类启动类在springboot启动类中加入服务端的启动代码,让netty服务跟着项...

weixin_42906256的博客 3万+

python调用hypermesh调用tcl_TclTk如何调用HyperMesh运行tcl脚本文件

#Tcl/Tk编写界面部分set t [toplevel .tp]focus $tgrab $tset Filename "E:/CAE_Tech/process_files/88/Example.tcl"set Font "Times 12 bold"wm title $t "Call HyperMesh"wm attribute $t -topmost 1wm withdraw $tset t...

weixin_39541681的博客 1601

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

netty源码学习之服务端客户端初始化

本篇博文从netty的使用例子出发,服务端bind()方法和客户端的connect()方法,分别分析了一下netty服务端和客户端的建立过程(大量篇幅),最终给予对上述理解简要总结了一次基于netty的一次请求和响应过程图解,希望对大家学习netty知识有所帮助,如果帮到你的话希望点赞、转发、一键三连让我们一起在技术的海洋遨游,奥利给!!!

liushangzaibeijing的博客 5万+

【大模型】大模型知识蒸馏 综述解读(Knowledge Distillation of Large Language Models)

知识蒸馏的(论文)方法总结。归纳了通过数据(如指令、对话、多模态)和训练方法(SFT、RL、数据增强),将复杂技能(如对齐、工具使用、多模态)蒸馏到开源模型的核心框架,附典型模型示例(如Alpaca、LLaVA)。

songxia928_928的博客 4340

Netty源码—服务端启动流程

用户调用启动辅助类ServerBootstrap的bind()方法时,第一步通过反射创建服务端Channel会执行NioServerSocketChannel的默认构造方法,来创建一个NioServerSocketChannel对象,并且在创建过程中会创建Netty的一系列核心组件:如Channel、ChannelConfig、ChannelId、Unsafe、ChannelPipeline。ServerBootstrap.bind() //用户代码入口。

sdgfafg_25的博客 1053

在WSL2中配置代理(Windows)

通过按照上述步骤在WSL2中配置代理,我们可以轻松地在Windows子系统Linux中使用代理服务器访问互联网。请确保提供正确的代理服务器地址和端口号,并根据实际情况进行修改。在WSL2中使用代理是一个常见的需求,它允许我们在Windows子系统Linux中通过代理服务器访问互联网。本文将详细介绍如何在WSL2中配置代理,并提供相应的源代码示例。如果返回的IP地址与代理服务器所在地不同,说明代理正常工作。希望本文能对你有所帮助!如有其他问题,请随时向我提问。替换为实际的代理服务器地址和端口号。

FcUnity的博客 4358

使用GitLab限制开发者使用CI/CD的权限,三种方案

使用三种方案来限制开发人员的CI/CD权限。

知无涯 5099

netty搭建socket服务端,接收客户端数据,主动发送数据给客户端

以前项目中用到的netty服务端,现分享出来; 服务端主动发送数据给客户端端,本代码在NioServer类中维护了个map集合用来存储连接的客户端;map的key为客户端发送过来报文中的id(这里你也可以使用ctx.channel().id()相关业务自己实现); 1.netty版本4.1.25 <!-- https://mvnrepository.com/artifact...

应用技术分享 2万+

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

netty tcp服务端主动断开客户端_【Netty】服务端和客户端

欢迎关注公众号:【爱编程】如果有需要后台回复2019赠送1T的学习资料哦!!本文是基于Netty4.1.36进行分析服务端Netty服务端的启动代码基本都是如下: private void start() throws Exception { final EchoServerHandler serverHandler = new EchoServerHandler(); ...

weixin_39643255的博客 2933

caverdock如何使用,一文给你多方案教学!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1393

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Netty源码—1.服务端启动流程一

用户调用启动辅助类ServerBootstrap的bind()方法时,第一步通过反射创建服务端Channel会执行NioServerSocketChannel的默认构造方法,来创建一个NioServerSocketChannel对象,并且在创建过程中会创建Netty的一系列核心组件:如Channel、ChannelConfig、ChannelId、Unsafe、ChannelPipeline。Selector的轮询操作是由其绑定的EventLoop线程run()方法驱动的,在一个循环体内循环执行。

mjunz的博客 1201

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Netty源码分析(2)-服务端启动流程

文章目录1. 服务端启动步骤2. 服务端启动流程详解 1. 服务端启动步骤 主要步骤为: 创建 ServerBootstrap 实例 设置并绑定 Reactor 线程池 设置并绑定服务端 Channel 创建并初始化 ChannelPipeline 添加并设置 ChannelHandler 绑定并启动监听端口 2. 服务端启动流程详解 ...

谈谈1974 3418

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Netty从入门到客户端与服务端通信——UDP协议

前言 不想多说什么,深刻的体会到学习方法的重要性,还有心态的问题,是否你能够沉得住气!耐的下心~这个过程感觉自己也是蛮拼的了~ 不过还好!终于让本姑娘有所收获了!!! Netty宏观 如果最开始你去了解Netty你会发现真尼玛难!进程,线程,并发,NIo,IO,这么多鬼玩意。。。。首先我们先从宏观去来接他 What是Netty? Netty是客户端于服务端进行通信的一个网络应用程...

Judy-命中注定与众不同 5278

Netty 客户端与服务端双向通信

2016年,拍摄于台湾省垦丁,这就是太平洋了,风太大了我这个吨位几乎站不住。 微信公众号 王皓的GitHub:https://github.com/TenaciousDWang 现在我们已经学会了如何启动一个Netty的客户端与服务端,接下来,我们来让他俩双向通讯。 客户端发送数据 首先,我们看一下引导类.handler这个位置,之前我们说过这...

JavaBoy王皓 3517

Netty客户端与服务端的连接

Netty是基于Java NIO的网络应用框架Netty是一个NIO client-server(客户端-服务端)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供一种新的方式来开发网络应用程序,这种新的方式它很容易使用和有很强的扩展性。Netty的内部实现是复杂的,但是Netty提供了简单易用的api,从网络处理代码中解耦业务逻辑。Netty是完全基于NIO实现的,...

qq_27903845的博客 9455

Netty服务端是如何启动的

Netty是一个用于构建高性能、可拓展、支持异步事件驱动的Java网络框架,基于该框架我们可以快速各种网络协议下的高性能Java网络应用程序。本篇文章基于自编写的引导类进行Netty服务端启动的流程进行详细分析和讲解。注意由于Netty服务端启动逻辑繁多,建议读者进行阅读时,可以基于源码跟随笔者的脚步一起调试,方便理解和掌握全流程。我们使用Netty编写服务端时需要基于这个引导类完成服务端配置工作,配置创建引导类。基于类完成IO模型、选项设置、属性设置、处理器设置。基于绑定端口和异步启动服务端。

禅与计算机程序设计的艺术 1159
上一篇: Netty(1)-BIO、NIO与Netty入门
下一篇: Netty(3)-实现客户端与服务端的双向通信
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值