首页 > 其他分享 >netty echo例子

netty echo例子

时间:2024-12-18 16:53:05浏览次数:4  
标签:netty ctx echo 例子 io import public channel

netty使用方法:
1. 选择事件处理线程池EventLoopGroup, 要与下面的管道选择对应名称, 服务端要两个(一个是接收客户端连接,另一个是处理客户端请求), 客户端只需要一个(处理客户端请求)
2. 创建Bootstrap对象, 配置事件处理线程池(上面new的Group)
3. 设置管道(有NioSocketChannel, EpollSocketChannel(linux下可用), LocalServerChannel(可能本地通信, 127.0.0.1之间))
4. 设置绑定的端口和主机名 如果是服务端就localAddress(8080), 如果是客户端就remoteAddress("127.0.0.1", 8080)
5. 绑定客户端处理类服务端使用childHandler, 客户端使用handler
6. 调用connect()方法, 阻塞直到连接成功
7. 阻塞直到channel关闭
8. 关闭线程池

例子代码下载

EchoServer.java

package org.example.echo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class EchoServer {

    public static void main(String[] args) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workerGroup);
            serverBootstrap.channel(NioServerSocketChannel.class).localAddress(8080);
            //serverBootstrap.channel(EpollServerSocketChannel.class);
            serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new EchoServerHandler());
                }
            });
            ChannelFuture channelFuture = serverBootstrap.bind().sync(); // 绑定端口,并同步等待成功
            channelFuture.channel().closeFuture().sync(); // 同步等待关闭channel
        } catch (Exception ex) {
            try {
                workerGroup.shutdownGracefully().sync();
            } catch(Exception e) { }
            try {
                bossGroup.shutdownGracefully();
            } catch (Exception e) {}
        }
    }
}

EchoServerHandler.java

package org.example.echo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.CharsetUtil;

import java.net.SocketAddress;

//@ChannelHandler.Sharable 标示一个Channel- Handler可以被多个Channel安全地共享
public class EchoServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
        SocketAddress address = ctx.channel().localAddress();
        System.out.println("收到连接 address:" + address.toString());
        // ctx.writeAndFlush("this is server's msg"); //直接写字符串收不到
        // ctx.writeAndFlush("this is server's msg".getBytes()); //直接写字节数组收不到
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello, this is server:" + Thread.currentThread().getId(),
                CharsetUtil.UTF_8));
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        SocketAddress address = ctx.channel().localAddress();
        System.out.println("连接断开 address:" + address.toString());
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //ctx.fireChannelRead(msg);
        ByteBuf in = (ByteBuf) msg;
        // 打印消息
        System.out.println("Server received: " + in.toString(io.netty.util.CharsetUtil.UTF_8));
        // 返回给客户端
        ctx.writeAndFlush(in);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

EchoClient.java

package org.example.echo;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

public class EchoClient {

    public static void main(String[] args) {
        NioEventLoopGroup group = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(group)  //指定客户端处理事件group
                .channel(NioSocketChannel.class); //NioSocketChannel
        bootstrap.remoteAddress("127.0.0.1", 8080); //指定服务器地址
        bootstrap.handler(new ChannelInitializer<NioSocketChannel>(){
            @Override
            protected void initChannel(NioSocketChannel ch) throws Exception {
                ch.pipeline().addLast(new EchoClientHandler());
            }
        });
        try {
            ChannelFuture future = bootstrap.connect().sync(); //阻塞并连结到远程结点
            future.channel().closeFuture().sync(); //阻塞直到channel关闭
        } catch (Exception ex){

        } finally {
            group.shutdownGracefully(); //关闭线程池
        }
    }
}

EchoClientHandler.java

package org.example.echo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.net.SocketAddress;

public class EchoClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

    public EchoClientHandler() {
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketAddress address = ctx.channel().localAddress();
        System.out.println("建立连接 address:" + address.toString());
        //直按发字符串或字节数组, 服务端收不到, 要使用Unpooled.copiedBuffer包裹
        ctx.writeAndFlush(Unpooled.copiedBuffer("Netty rocks!",
                CharsetUtil.UTF_8));
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        SocketAddress address = ctx.channel().localAddress();
        System.out.println("连接断开 address:" + address.toString());
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
        //ctx.fireChannelRead(msg);
        ByteBuf in = (ByteBuf) msg;
        // 打印消息
        System.out.println("收到回应: " + in.toString(io.netty.util.CharsetUtil.UTF_8));
        // 返回给客户端
        Thread.sleep(1000);
        //直按发字符串或字节数组, 服务端收不到, 要使用Unpooled.copiedBuffer包裹
        ctx.writeAndFlush(Unpooled.copiedBuffer("current Time:" + System.currentTimeMillis(), CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
            throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

 

标签:netty,ctx,echo,例子,io,import,public,channel
From: https://www.cnblogs.com/barrysgy/p/18615363

相关文章

  • Netty出现的异常【已解决】:An exceptionCaught() event was fired, and it reached at
    修改方案:byteBuf.retain();ByteBuf后面添加这个retain(),这个添加原则是这样,如果你消耗了一次ByteBuf,你的下游Handler还需要再次消耗的话,就需要添加这个retain(),以此类推,一定要要注意添加的时机,不然的话可能需要自己手动释放;原因分析:这个错误是因为ByteBuf的已经被逻辑释放......
  • Netty网络框架详细讲解
    一、Netty基本内容1.什么是netty?Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。异步的:事件驱动:基于JavaNIO(Non-blockingI/O)的Selector实现的。Netty的核心设计目标是:高性能:充分利用JavaNIO的非阻塞特性。可扩......
  • golang 使用gzip对json例子
    packagemainimport(  "bytes"  "compress/gzip"  "encoding/json"  "fmt"  "io"  "log")//User结构体定义typeUserstruct{  ID int  `json:"id"`  Namestring......
  • 【Netty】IO模型
    官方参考:https://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 1)BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,线程开销大。2)NIO:一个请求一个线程,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到该连接有I/O请求时才启动一个线程进行处理......
  • rust可以和C语言程序使用grpc进行通信吗? rust是客户端,C是服务端。 如果可以的话,举一个
    是的,Rust可以与C语言程序通过gRPC进行通信。gRPC是一个语言中立的通信框架,支持多种语言之间的互操作,包括Rust和C。关键步骤概述:定义gRPC接口(.proto文件):定义服务端和客户端之间的接口。C服务端实现:使用C语言实现服务端,处理客户端的请求。Rust客户端实现:使......
  • 【翻译_by_gpt】通过一个奇怪的技巧让你的 QEMU 快 10 倍(软件开发中的一个典型的debug
    标题:通过一个奇怪的技巧让你的QEMU快10倍URL来源:https://linus.schreibt.jetzt/posts/qemu-9p-performance.htmlMarkdown内容:这篇关于QEMU的工作和文章由DeterminateSystems资助,并在DeterminateSystems博客上共同发布。背景NixOS广泛使用基于QEMU的虚拟机......
  • AIGC与虚拟现实(VR)的结合与应用前景分析例子解析
    代码示例:在探讨AIGC(人工智能生成内容)与虚拟现实(VR)的结合与应用前景时,我们可以从以下几个详细例子进行分析:1.教育培训AIGC与VR的结合在教育培训领域展现出巨大潜力。例如,学生可以通过VR技术走进历史场景,配合AIGC自动生成的讲解和角色对话,增强学习的趣味性和有效性。这种......
  • chrome跳转新页面自动打开devtools调试工具的方法例子解析
    代码示例:根据您的需求,要在Chrome浏览器中实现跳转新页面时自动打开开发者工具(DevTools),以下是详细的步骤:方法一:设置Chrome开发者工具偏好打开Chrome浏览器。打开开发者工具。您可以通过点击页面右上角的三个点(菜单按钮),选择“更多工具”>“开发者工具”,或者使用快捷键F1......
  • 解决MobaXterm连接不上虚拟机:Network error: Connection timed out问题例子解析
    代码示例:针对您提出的MobaXterm连接不上虚拟机并出现"Networkerror:Connectiontimedout"的问题,以下是一些详细的解决步骤和例子:检查虚拟机端是否安装SSH服务:通常虚拟机会自动安装SSH服务,您可以通过在虚拟机终端输入ssh命令进行测试。如果系统提示commandnotfound......
  • 微软官方驱动例子SimpleAudioSample安装失败的解决
    无法编译微软有一个Bug,Spectre,现在被缓解了,但是代价是你要在VS2022中安装一大把的环境,否则此例子无法编译……无法安装devcon.exe,如图执行后得到:但是设备管理器里找得到这个设备……说明是安装了,但安装之后并没有执行起来无法安装——从devcon.exe定位devcom.exe的输出......