我正在中编写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