代码之家  ›  专栏  ›  技术社区  ›  user51

io.nety.channel.socket.nio.NioServerSocketChannel.doConnect处的java.lang.UnsupportedOperationException(NioServerSocketChanel.java:178)

  •  0
  • user51  · 技术社区  · 2 年前

    我正在中编写Netty教程 youtube

    我有以下服务器代码-

    package yt.ingrim.p01;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.*;
    import io.netty.channel.epoll.Epoll;
    import io.netty.channel.epoll.EpollEventLoopGroup;
    import io.netty.channel.epoll.EpollServerSocketChannel;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    public class Server {
        public static class MySimpleChannelInboundHandler extends SimpleChannelInboundHandler<Object> {
            @Override
            public void channelActive(ChannelHandlerContext ctx) throws Exception {
                super.channelActive(ctx);
                System.out.println("channel Connected --> " + ctx.channel());
            }
    
            @Override
            protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
    
            }
        }
        public static final boolean EPOLL = Epoll.isAvailable();
        Class channelClazz = EPOLL? EpollServerSocketChannel.class : NioServerSocketChannel.class;
    
        public Server() throws Exception {
            EventLoopGroup eventLoopGroup = EPOLL? new EpollEventLoopGroup(): new NioEventLoopGroup();
            try {
                new ServerBootstrap()
                        .group(eventLoopGroup)
                        .channel(channelClazz)
                        .childHandler(new ChannelInitializer<Channel>() {
                            @Override
                            protected void initChannel(Channel ch) throws Exception {
                                ChannelPipeline cpl = ch.pipeline();
                                cpl.addLast("default_channel_handler", new MySimpleChannelInboundHandler());
                            }
                        }).bind(8000).sync().channel().closeFuture().syncUninterruptibly();
            } finally {
                eventLoopGroup.shutdownGracefully().await();
            }
        }
        public static void main(String[] args) throws Exception {
            new Server();
        }
    }
    

    客户代码为-

    package yt.ingrim.p01;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.Channel;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.epoll.Epoll;
    import io.netty.channel.epoll.EpollEventLoopGroup;
    import io.netty.channel.epoll.EpollServerSocketChannel;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    import java.net.InetSocketAddress;
    
    public class Client {
    
        public static final boolean EPOLL = Epoll.isAvailable();
    
        Class channelClazz = EPOLL? EpollServerSocketChannel.class : NioServerSocketChannel.class;
    
        public Client() throws Exception {
            EventLoopGroup eventLoopGroup = EPOLL? new EpollEventLoopGroup(): new NioEventLoopGroup();
            try {
                new Bootstrap()
                        .group(eventLoopGroup)
                        .channel(channelClazz)
                        .remoteAddress(new InetSocketAddress("127.0.0.1", 8000))
                        .handler(new ChannelInitializer<Channel>() {
                            @Override
                            protected void initChannel(Channel ch) throws Exception {
    
                            }
                        }).connect().sync().channel().closeFuture().syncUninterruptibly();
            } finally {
                eventLoopGroup.shutdownGracefully().sync();
            }
        }
        public static void main(String []args) throws Exception {
            System.out.println(EPOLL);
            new Client();
        }
    }
    

    在我的系统中,EPOLL是错误的。当我运行服务器时,它运行良好。

    当我运行客户端时,我得到以下错误-

    线程“main”java.lang.UnsupportedOperationException中出现异常 位于io.nety.channel.socket.nio.NioServerSocketChannel.doConnect(NioServerSocketChandle.java:178) 位于io.nety.channel.nio.AbstractNioChannel$AbstractNioUnsafe.connect(AbstractNicoChannel.java:248) 位于io.nety.channel.DefaultChannelPipeline$HeadContext.connect(DefaultChannelPiperine.java:1342) 位于io.nety.channel.AbstractChannelHandlerContent.invokeConnect(AbstractChannelHandler内容.java:548) 位于io.nety.channel.AbstractChannelHandlerContent.connect(AbstractChannelHandler内容.java:533) 位于io.nety.channel.AbstractChannelHandlerContext.connect(AbstractChannelHandler内容.java:517) 位于io.netty.channe.DefaultChannelPipeline.connect(DefaultChannelPipeline.java:978) 位于io.nety.channel.AbstractChannel.connect(AbstractChannel.java:265) 在io.netty.bootstrap.bootstrap$3.run(bootstrap.java:250) 位于io.nety.util.concurrent.AbstractEventExecutiator.runTask(AbstractEventExecutior.java:174) 位于io.nety.util.concurrent.AbstractEventExecutiator.safeExecute(AbstractEventExecutior.java:167) 位于io.nety.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) 位于io.nety.channel.nio.NioEventLoop.run(NioEventLoop.java:569) 位于io.nety.util.concurrent.SingleThreadEventExecutiator$4.run(SingleThreadEventExecutor.java:997) 位于io.nety.util.internal.ThreadExecutiorMap$2.run(ThreadExecutiorMap.java:74) 位于io.nety.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 位于java.base/java.lang.Thread.run(线程.java:829)

    我的代码与教程中的完全相同。我的代码中有什么问题。如何解决此问题?

    Netty版本为4.1.82.Final Java版本为-17

    java --version
    openjdk 17.0.3-oracle
    

    我的代码在github上 here

    0 回复  |  直到 2 年前
        1
  •  1
  •   HyperX Pro    2 年前

    这是因为您在Bootstrap中使用ServerSocketChannel而不是SocketChannel。

    使用EpollSocketChannel和NioSocketChannel。