netty入坑第一步:了解netty和编写简单的Echo服务器和客户端
早期java API通过原生socket产生所谓的"blocking",大致过程是这样

这种的特点是每次只能处理一个请求,如果要实现多个请求并行,就还要分配一个新的线程来给每个客户端的socket''
。但考虑使用这种方法来支持大 量的同步,长连接。在任何时间点多线程可能处于休眠状态,等待输入或输出数据。
这很容 易使得资源的大量浪费,对性能产生负面影响。
netty的构成部分:
Channel:顾名思义,他代表连接到实体(入硬件设备,文件)的套接字和程序组件,能够执行多个I/O操作的开发连接
Callback,回调,很多时候我们可以将它用于通知某个操作已经完成,netty内部使用回调处理事件的时候,一旦被触发,事件可
通过ChannelHandler的实现来处理
Future:提供另外一种通知应用操作已经完成的方式.
Echo服务器:
Handler:实现服务器的业务逻辑,决定了连接后和接收信息该如何处理
Bootstrapping:配置服务器的启动方式,他必须设置一个端口来监听请求
实现简单的EchoServer和EchoClient
代码就不贴了,书里面都有,再贴就没必要
然而书里对maven多模块构建过程也讲的不多,我也踩了坑
首先,构建一个空工程

取好名字,然后next

然后


这里因为不使用模板,所以不勾选maven模块,然后填好信息,点击next,点击finish

还是这个界面,点击绿色的+号,跟上面步骤一样

到达这一步的时候,注意一下,如果这两个模块是父子关系,那就一个parent模块,像这里,client和server是并列关系, 就不用

之后,将代码写进去,对应的代码卸载对应的模块里,不要忘了导入netty的依赖
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
然后准备对应的编译工作
编译maven模块需要的插件:并且还要配置main文件和goal标签
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定main文件,不指定会报错-->
<mainClass>EchoServer</mainClass>
</configuration>
</plugin>
一切工作准备就绪,打开IDEA的终端,输入mvn clean package
这样则是编译成功

在编译之后,我们需要去相应的模块里去执行相应的main函数,那这里注意一下,就是netty那本书里面是直接用的mvn exec:java
但是这样是看不出实验效果的,需要带上参数,用mvn exec:java -Dexec.args="arg0 arg1"这样的才能看出效果,因为这个例子里指定了
参数的个数判断,并且将参数的第一个作为监听的端口,所以需要将后面的参数用整数形式,否则产生NumberFormatException
所以这里简单,server模块里用exec:java -Dexec.args="1",即监听端口1,不过在这之前请cd server到server目录下执行这个命令
然后看到如下信息

再通过cd 命令切换到client的目录,这次将后面的参数改为两个
mvn exec:java -Dexec.args="0 1"
然后就会看到,client的有相应的response打印出来

再看到之前的server模块的终端,也可以看到相应信息

新买的netty实战的书买了还没到,在Gitbook上搜了一本netty实战精髓先看了看,这里也是根据这个来的,明天新书来了就开动
netty入坑第一步:了解netty和编写简单的Echo服务器和客户端的更多相关文章
- mybatis入“坑”第一步
一.导入坐标 要想通过maven创建一个简单的mybatis项目,首先需要的是要导入相关的坐标.需要导入的坐标如下: <dependencies> <!--mysql驱动坐标--&g ...
- vue.js 踩坑第一步 利用vue-cli vue-router搭建一个带有底部导航栏移动前端项目
vue.js学习 踩坑第一步 1.首先安装vue-cli脚手架 不多赘述,主要参考WiseWrong 的 Vue 爬坑之路(一)-- 使用 vue-cli 搭建项目 2.项目呈现效果 项目呈现网址:w ...
- Vue入坑第一篇
写在前面的话:文章是个人学习过程中的总结,为方便以后回头在学习.文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. 一.前言 本篇作为vue入门的一 ...
- Vue踩坑第一步,安装Vue最新版本
学习vue第一步肯定是安装vue-cli,那么肯定想去搜下如何安装vue-cli呢? 网上搜到的结果大都是: npm i vue-cli -g 输入vue -V发现: 输入node -v发现: 自己明 ...
- Go语言开发的第一步,安装开发环境编写第一个Go程序
关于go就不介绍了,google自己的语言.其它的百科,最近比较郁闷,处于纠结状态,不想说话,真心不想说话. 开发工具安装: 安装包下载: http://code.google.com/p/go/do ...
- 入“坑”mybatis后如何挣脱?
既然已经入"坑"mybatis了,你竟然还想着挣脱,我是不会让你挣脱的~ 当然我有一个算是挣脱的办法.那就是把它学会.理解透.这样我们也就不用在坑里一直徘徊,也算得上是一种挣脱吧! ...
- SpringBoot入坑-项目搭建
对于学过三大框架的小童鞋,从今天开始给大家带来一套新的框架学习,相信对于做程序的小童鞋一定有所耳闻,作为下一代java开发框架springboot,减去了繁琐的xml配置,相信用过spring.sta ...
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- 第一章:Netty介绍
1. Netty介绍 Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,Netty是基于NIO实现的,所以整个Netty都是异步操作,网络应用 ...
随机推荐
- java 日志体系(四)log4j 源码分析
java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...
- gperftools对程序进行分析
gperftools是google出品的一个性能分析工具,相关介绍可见:https://github.com/gperftools/gperftools/wikigperftools性能分析通过抽样方 ...
- JavaScript中的闭包永远都存储在内存中,除非关闭浏览器
//閉包實現累加功能 function fn1() { var n = 1; add = function() { n += 1; } function fn2() { n += 1; console ...
- 使用rar把程序打包成一个exe
根目录--全部文件--右键添加到压缩文件 常规--创建自解压压缩文件 高级--自解压选项 解压路径--Finger(自己写)--在"Program Files"中创建 设置--解压 ...
- 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)
传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi∑ai的最大值. 思路:一眼要01分数规划, ...
- Nexus安装、使用说明、问题总结
Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...
- USB设备类学习笔记
usb audio class 版本目前有3个版本 分别是1.0,2.0,3.0:1.0针对各个厂家的设备具有不同的描述符,而2.0则将它们统一简化,3.0则是最新的,还没有与2.0作进一步比较:因 ...
- UML model refactoring: a systematic literature review
一.基本信息 标题:UML model refactoring: a systematic literature review 时间:2015 出版源:Empirical Software Engin ...
- vue的指令
我之前学了学angular 发现angular和vue的指令有点类似 先说一下 new Vue({ el: "#box", // element(元素) 当前作 ...
- UE4物理动画使用
Rigid Body Body的创建. 对重要骨骼创建Body,保证Body控制的是表现和变化比较大的骨骼. 需要对Root创建Body并绑定,设置为Kinematic且不启用物理.原因是UPrimi ...