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实战精髓先看了看,这里也是根据这个来的,明天新书来了就开动

原文地址:https://www.cnblogs.com/Yintianhao/p/10137884.html