首页 > Web开发 > 详细

netty入坑第一步:了解netty和编写简单的Echo服务器和客户端

时间:2018-12-18 16:39:36      阅读:142      评论:0      收藏:0      [点我收藏+]

 

早期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入坑第一步:了解netty和编写简单的Echo服务器和客户端

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!