netty 学习入门

本文档介绍了Netty学习过程中遇到的连接拒绝错误及解决方案,讲解了protobuf的使用,包括protobuf协议文件创建、Java类生成,并探讨了ChannelInboundHandlerAdapter的作用。同时,提供了NettyProtobufClient和NettyProtobufServer的实现细节。
摘要由CSDN通过智能技术生成

错误:
1.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:8080

第一个错是没有启动 server 端

2.Caused by: java.net.ConnectException: Connection refused: no further information:/127.0.0.1:8080
代码:

 public void bind(int port) {
   
        
        EventLoopGroup mainGroup = new NioEventLoopGroup();
        
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
   

            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(mainGroup, workerGroup)
            
                    .channel(NioServerSocketChannel.class)
                    
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    
                    .childHandler(new ChannelInitializer<SocketChannel>() {
   
                        
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
   
                        
                            socketChannel.pipeline().addLast(new NettyHeartbeatServerHandler());
                            
                        }
                    });

            ChannelFuture future = serverBootstrap.bind(port).sync();
			/**这没有加sync()方法造成的*/
            future.channel().closeFuture();
            
        } catch (Exception e) {
   
            e.printStackTrace();
        } finally {
   
        
            mainGroup.shutdownGracefully();
            
            workerGroup.shutdownGracefully();
            
        }

    }

3.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:8080

public void bind(int port) {
   
        
        EventLoopGroup mainGroup = new NioEventLoopGroup();
        
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
   

            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(mainGroup, workerGroup)
            
                    .channel(NioServerSocketChannel.class)
                    
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    
                    .childHandler(new ChannelInitializer<SocketChannel>() {
   
                        
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
   
                        
                            socketChannel.pipeline().addLast(new NettyHeartbeatServerHandler());
                            
                        }
                    });
			/***模拟的一个异常**/
			int i = 10/0;
            ChannelFuture future = serverBootstrap.bind(port).sync();
			
            future.channel().closeFuture().sync();
            
        } catch (Exception e) {
   
            e.printStackTrace();
        } finally {
   
        
            mainGroup.shutdownGracefully();
            
            workerGroup.shutdownGracefully();
            
        }

    }

/这里是我的代码报错点,netty-all 4.1.50Final 仅参照***/

~ server端

public void bind(int port) {
   
        
        EventLoopGroup mainGroup = new NioEventLoopGroup();
        
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
   

            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(mainGroup, workerGroup)
            
                    .channel(NioServerSocketChannel.class)
                    
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    
                    .childHandler(new ChannelInitializer<SocketChannel>() {
   
                        
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
   
                        
                            socketChannel.pipeline().addLast(new NettyHeartbeatServerHandler());
                            
                        }
                    });

            ChannelFuture future = serverBootstrap.bind(port).sync();
			
            future.channel().closeFuture().sync();
            
        } catch (Exception e) {
   
            e.printStackTrace();
        } finally {
   
        
            mainGroup.shutdownGracefully();
            
            workerGroup.shutdownGracefully();
            
        }

    }

~ protobuf

pom.xml

  <!--netty -->
            <!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>4.1.50.Final</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.12.2</version>
            </dependency>
            <!--netty -->

安装windows - protoc
下载 : https://github.com/google/protobuf/releases

1.解压protoc-3.12.3-win64.zip
2.配置环境变量:F:\pro\protoc-3.12.3-win64\bin
3.将protoc.exe拷贝到C:\Windows\System32
4.在cmd下执行 protoc --version 或 protoc --help查看

在这里插入图片描述
创建UserProto.proto

syntax = "proto2";

package protocol;

option java_package = "com.jxfj.protoful"; //记得改成你的java文件生成路径
option java_outer_classname = "UserProto";

message UserProtocol {
   
  required string id = 1;
  required string name = 2;
}

这个文件放置位置,找得到就好,就好。
在这里插入图片描述
在cmd或idea terminal下 执行:

protoc --java_out=./netty/src/main/java ./netty/protobuf/UserProto.proto
//  ./netty/src/main/jav 生成java的package位置
//  ./netty/protobuf/UserProto.proto 上图给你画红框的位置

生成 Useproto.java完成。

~~ 好好奇下面这个类怎么生成的 特别是心跳协议部分~~

怎么做啊?


package com.snowcattle.game.message.auto.http.client;

public final class OnlineClientHttpProBuf {
   
  private OnlineClientHttpProBuf() {
   }
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistryLite registry) {
   
  }

  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
   
    registerAllExtensions(
        (com.google.protobuf.ExtensionRegistryLite) registry);
  }
  public interface OnlineHeartClientHttpProBufOrBuilder extends
      // @@protoc_insertion_point(interface_extends:OnlineHeartClientHttpProBuf)
      com.google.protobuf.MessageOrBuilder {
   

    /**
     * <code>required int32 id = 1;</code>
     */
    boolean hasId();
    /**
     * <code>required int32 id = 1;</code>
     */
    int getId();
  }
  /**
   * <pre>
   *心跳协议
   * </pre>
   *
   * Protobuf type {@code OnlineHeartClientHttpProBuf}
   */
  public  static final class OnlineHeartClientHttpProBuf extends
      com.google.protobuf.GeneratedMessageV3 implements
      // @@protoc_insertion_point(message_implements:OnlineHeartClientHttpProBuf)
      OnlineHeartClientHttpProBufOrBuilder {
   
    // Use OnlineHeartClientHttpProBuf.newBuilder() to construct.
    private OnlineHeartClientHttpProBuf
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值