早期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实战精髓先看了看,这里也是根据这个来的,明天新书来了就开动
共同学习,写下你的评论
评论加载中...
作者其他优质文章