我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在netty中如何使用native传输协议

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在netty中如何使用native传输协议

本篇内容主要讲解“在netty中如何使用native传输协议”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在netty中如何使用native传输协议”吧!

简介

对于IO来说,除了传统的block IO,使用最多的就是NIO了,通常我们在netty程序中最常用到的就是NIO,比如NioEventLoopGroup,NioServerSocketChannel等。

我们也知道在IO中有比NIO更快的IO方式,比如kqueue和epoll,但是这两种方式需要native方法的支持,也就是说需要在操作系统层面提供服务。

如果我们在支持Kqueue或者epoll的服务器上,netty是否可以提供对这些优秀IO的支持呢?

答案是肯定的。但是首先kqueue和epoll需要JNI支持,也就是说JAVA程序需要调用本地的native方法。

native传输协议的依赖

要想使用kequeue和epoll这种native的传输方式,我们需要额外添加项目的依赖,如果是linux环境,则可以添加如下的maven依赖环境:

  <dependencies>    <dependency>      <groupId>io.netty</groupId>      <artifactId>netty-transport-native-epoll</artifactId>      <version>${project.version}</version>      <classifier>linux-x86_64</classifier>    </dependency>    ...  </dependencies>

其中version需要匹配你所使用的netty版本号,否则可能出现调用异常的情况。

classifier表示的是系统架构,它的值可以是linux-x86_64,也可以是linux-aarch_64.

如果你使用的mac系统,那么可以这样引入:

  <dependencies>    <dependency>      <groupId>io.netty</groupId>      <artifactId>netty-transport-native-kqueue</artifactId>      <version>${project.version}</version>      <classifier>osx-x86_64</classifier>    </dependency>    ...  </dependencies>

netty除了单独的个体包之外,还有一个all in one的netty-all包,如果你使用了这个all in one的包,那么不需要额外添加native的依赖。

如果netty提供的系统架构并没有你正在使用的,那么你需要手动进行编译,以下是编译所依赖的程序包, 如果是在RHEL/CentOS/Fedora系统中,则使用:

sudo yum install autoconf automake libtool make tar \                 glibc-devel \                 libgcc.i686 glibc-devel.i686

如果是在Debian/Ubuntu系统中,则使用:

sudo apt-get install autoconf automake libtool make tar \                     gcc

如果是在MacOS/BSD系统中,则使用:

brew install autoconf automake libtool

netty本地传输协议的使用

安装好依赖包之后,我们就可以在netty中使用这些native传输协议了。

native传输协议的使用和NIO的使用基本一致,我们只需要进行下面的替换即可。

如果是在liunx系统中,则进行下面的替换:

    NioEventLoopGroup → EpollEventLoopGroup    NioEventLoop → EpollEventLoop    NioServerSocketChannel → EpollServerSocketChannel    NioSocketChannel → EpollSocketChannel

如果是在mac系统中,则进行下面的替换:

    NioEventLoopGroup → KQueueEventLoopGroup    NioEventLoop → KQueueEventLoop    NioServerSocketChannel → KQueueServerSocketChannel    NioSocketChannel → KQueueSocketChannel

这里还是使用我们熟悉的聊天服务为例,首先看下基于Kqueue的netty服务器端应该怎么写:

EventLoopGroup bossGroup = new KQueueEventLoopGroup(1);        EventLoopGroup workerGroup = new KQueueEventLoopGroup();        try {            ServerBootstrap b = new ServerBootstrap();            b.group(bossGroup, workerGroup)             .channel(KQueueServerSocketChannel.class)             .handler(new LoggingHandler(LogLevel.INFO))             .childHandler(new NativeChatServerInitializer());            Channel channel = b.bind(PORT).sync().channel();            log.info("server channel:{}", channel);            channel.closeFuture().sync();

和NIO一样,在服务器端我们需要使用KQueueEventLoopGroup创建两个EventLoopGroup,一个是bossGroup, 一个是workerGroup。

然后将这两个group传入到ServerBootstrap中,并且添加KQueueServerSocketChannel作为channel。

其他的内容和NIO server的内容是一样的。

接下来我们看下基于Kqueue的netty客户端改如何跟server端建立连接:

EventLoopGroup group = new KQueueEventLoopGroup();        try {            Bootstrap b = new Bootstrap();            b.group(group)             .channel(KQueueSocketChannel.class)             .handler(new NativeChatClientInitializer());            // 建立连接            Channel ch = b.connect(HOST, PORT).sync().channel();            log.info("client channel: {}", ch);

这里使用的是KQueueEventLoopGroup,并将KQueueEventLoopGroup放到Bootstrap中,并且为Bootstrap提供了和server端一致的KQueueSocketChannel。

然后就是客户端向channel中写消息,这里我们直接从命令行输入:

// 从命令行输入            ChannelFuture lastWriteFuture = null;            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));            for (;;) {                String line = in.readLine();                if (line == null) {                    break;                }                // 将从命令行输入的一行字符写到channel中                lastWriteFuture = ch.writeAndFlush(line + "\r\n");                // 如果输入'再见',则等待server端关闭channel                if ("再见".equalsIgnoreCase(line)) {                    ch.closeFuture().sync();                    break;                }            }

上面代码的意思是将命令行收到的消息写入到channel中,如果输入的是&rsquo;再见&rsquo;,则关闭channel。

为了能够处理字符串,这里用到了三个编码解码器:

        // 添加行分割器        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));        // 添加String Decoder和String Encoder,用来进行字符串的转换        pipeline.addLast(new StringEncoder());        pipeline.addLast(new StringDecoder());

分别是行分割器,字符编码器和字符解码器。

运行一下看,程序运行没问题,客户端和服务器端可以进行通讯。

到此,相信大家对“在netty中如何使用native传输协议”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在netty中如何使用native传输协议

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在netty中如何使用native传输协议

本篇内容主要讲解“在netty中如何使用native传输协议”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在netty中如何使用native传输协议”吧!简介对于IO来说,除了传统的block
2023-06-30

Java Socket如何使用加密协议传输对象

本篇文章为大家展示了Java Socket如何使用加密协议传输对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前面几篇博文提到了Socket中一些常用的用法,但是对于一些有安全要求的应用就需要加密
2023-06-17

还在使用文件传输协议传输机密文件?你可能是对文件传输协议有什么误会

文件传输协议(FTP)为用户提供了一种从一个位置临时向另一个位置发送文件和信息的简单方法。FTP提供了一种在计算机(或服务器)之间建立通信以进行文件传输的介质。尽管它仍然是一种广泛使用且被大众熟知的文件传输方法,但人们对FTP有诸多误解,以
2023-06-03

如何在java中的使用UDP协议

本篇文章为大家展示了如何在java中的使用UDP协议,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认
2023-06-06

如何在无线J2ME设备上实现超文本传输协议

这篇文章主要介绍如何在无线J2ME设备上实现超文本传输协议,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问web站点变得越来越重要。Java
2023-06-03

如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输

SFTP是一种加密协议,能够安全地传输文件。本文指导您在CentOS服务器上配置SFTP,包括安装OpenSSH、启用SFTP子系统、创建SFTP用户和配置SFTP访问权限。此外,还提供了使用SFTP客户端连接到服务器和实施额外安全措施(如公钥认证和端口转发)的指南。通过遵循这些步骤,您可以有效保护文件传输并降低敏感数据泄露的风险。
如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输
2024-04-13

linux如何在家中使用SSH和SFTP协议

这篇文章给大家分享的是有关linux如何在家中使用SSH和SFTP协议的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过 SSH 和 SFTP 协议,我们能够访问其他设备,有效而且安全的传输文件等等。几年前,我决
2023-06-16

如何使用安全的文件传输协议(SFTP)保护CentOS服务器上的文件传输

要在CentOS服务器上使用安全的文件传输协议(SFTP)来保护文件传输,需要执行以下步骤:1. 安装OpenSSH服务器:```shellsudo yum install openssh-server```2. 启动OpenSSH服务器并
2023-10-09

java 中如何实现模拟TCP协议进行传输数据

java 中如何实现模拟TCP协议进行传输数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、创建TCP传输的客户端1、建立TCP客户端的Socket服务,使用的是Soc
2023-05-31

如何在HTTP协议接口测试中使用HttpClient

本篇文章为大家展示了如何在HTTP协议接口测试中使用HttpClient,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、GET请求: GET请求时,参数一般是写在链接上的,代码如下:public
2023-05-31

如何在Vue中调用JavaScript中的UDP协议

Vue作为一款轻量级的JavaScript框架,可以在网页中构建灵活的用户界面,并且支持与其他JavaScript代码的交互以实现更丰富的功能。在一些特定的场景下,我们需要使用UDP协议来进行数据传输。本文将介绍如何在Vue中调用JavaScript中的UDP协议。UDP协议简介在计算机网络中,UDP(User Datagram Protocol)是一个无连接的传输协议,提供了
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录