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

  • 相关阅读:
    Neptune w800开发版ubuntu linux环境编译通过——如何搭建开发环境
    neptune HarmonyOS开发板视频教程-环境搭建-编译-烧录-外设控制
    Neptune开发板与hiSpark开发板底板的管脚不兼容
    《设计心理学》要点(上)
    NLP(三十二):大规模向量相似度检索方案
    VIM编辑器设置
    (十一)pytorch加速训练的17种方法
    (十)pytorch多线程训练,DataLoader的num_works参数设置
    NLP(三十一):用transformers库的BertForSequenceClassification实现文本分类
    NLP(三十):BertForSequenceClassification:Kaggle的bert文本分类,基于transformers的BERT分类
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/10137884.html
Copyright © 2011-2022 走看看