spring boot 集成 netty出现java.lang.NullPointerException: childHandler错误

HITYM627 2019-08-18 07:39:13
启动中出现
java.lang.NullPointerException: childHandler
at io.netty.bootstrap.ServerBootstrap.childHandler(ServerBootstrap.java:134)
at com.example.demo.server.NettyServer.startServer(NettyServer.java:44)
at com.example.demo.server.NettyServer.run(NettyServer.java:72)
at java.lang.Thread.run(Thread.java:748)

下面是demo全部源码

NettyServer 源码
package com.example.demo.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;
import javax.annotation.Resource;

@Component(value = "nettyServer")
public class NettyServer implements Runnable {

@Resource
private NettyServerInitializer nettyServerInitializer;

@Resource
private NettyServerHandler nettyServerHandler;

private int port = 7000;

private EventLoopGroup boss = new NioEventLoopGroup();
private EventLoopGroup worker = new NioEventLoopGroup();

private ChannelFuture cf = null;

/**
* 启动server
*/
public void startServer() {
try {
System.out.println("go!");
ServerBootstrap b = new ServerBootstrap();
b.group(boss, worker);
b.channel(NioServerSocketChannel.class);
b.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, 2048, 65536));
b.childHandler(nettyServerInitializer);
cf = b.bind(port).sync();
cf.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}

@PreDestroy
public void stop() {
try {
// 监听服务器关闭监听
if (cf != null)
cf.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
boss.shutdownGracefully();
worker.shutdownGracefully();
}
}

@Override
public void run() {
try {
this.startServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}

NettyClient源码
package com.example.demo.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class NettyServerInitializer extends ChannelInitializer<SocketChannel> {

@Resource
private NettyServerHandler nettyServerHandler;

@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ByteArrayDecoder());
pipeline.addLast(new ByteArrayEncoder());
pipeline.addLast(nettyServerHandler);
}
}

NettyHandler源码

package com.example.demo.server;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.springframework.stereotype.Component;

@Component
@ChannelHandler.Sharable
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("server channel active... ");
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
String body = (String)msg;
System.out.println("Server 接收到 :" + body );
String response = "返回给客户端的响应:" + body ;
ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
System.out.println("server: 读完了");
ctx.flush();
}

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

启动app程序源码

package com.example.demo;

import com.example.demo.client.NettyClient;
import com.example.demo.server.NettyServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

public static void runNettyServer(){
NettyServer nettyServer = new NettyServer();
Thread thread = new Thread(nettyServer);
thread.start();
System.out.println("Netty Server Start Success!");
}

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
try {
runNettyServer();
}catch (Exception e){
e.printStackTrace();
}
}

}
...全文
813 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
HITYM627 2019-08-18
  • 打赏
  • 举报
回复
补充一下 spring boot 版本 2.1.7.release netty版本 4.0.40

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧