【问题标题】:SimpleChannelInboundHandler never fires channelRead0SimpleChannelInboundHandler 从不触发 channelRead0
【发布时间】:2019-11-11 05:53:04
【问题描述】:

有一天我决定使用 Tcp 协议创建一个 Netty 聊天服务器。目前,它成功记录连接和断开连接,但我的处理程序中的 channelRead0 永远不会触发。我试过 Python 客户端。 Netty 版本:4.1.6.Final

处理程序代码:

public class ServerWrapperHandler extends SimpleChannelInboundHandler<String> {

    private final TcpServer server;

    public ServerWrapperHandler(TcpServer server){

        this.server = server;
    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) {
        System.out.println("Client connected.");
        server.addClient(ctx);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) {
        System.out.println("Client disconnected.");
        server.removeClient(ctx);
    }

    @Override
    public void channelRead0(ChannelHandlerContext ctx, String msg) {
        System.out.println("Message received.");
        server.handleMessage(ctx, msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        System.out.println("Read complete.");
        super.channelReadComplete(ctx);
    }

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

输出:

[TCPServ] Starting on 0.0.0.0:1052
Client connected.
Read complete.
Read complete.
Client disconnected.

客户端代码:

import socket
conn = socket.socket()
conn.connect(("127.0.0.1", 1052))
conn.send("Hello")
tmp = conn.recv(1024)
while tmp:
    data += tmp
    tmp = conn.recv(1024)
print(data.decode("utf-8"))
conn.close()

【问题讨论】:

  • 请添加有关如何设置管道的代码
  • @NormanMaurer 我的管道实际上导致了这个问题,非常感谢您的帮助!

标签: java server netty


【解决方案1】:

顺便说一句,问题出在我的初始化程序中:我将 DelimiterBasedFrameDecoder 添加到我的管道中,这个解码器正在停止线程。我不知道为什么,但我不需要这个解码器,所以我把它删除了,一切都开始工作了。

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        // Create a default pipeline implementation.
        ChannelPipeline pipeline = ch.pipeline();

        // Protocol Decoder - translates binary data (e.g. ByteBuf) into a Java object.
        // Protocol Encoder - translates a Java object into binary data.

        // Add the text line codec combination first,
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); //<--- DELETE THIS
        pipeline.addLast("decoder", new StringDecoder());
        pipeline.addLast("encoder", new StringEncoder());
        pipeline.addLast("handler", new ServerWrapperHandler(tcpServer));
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2015-10-16
    相关资源
    最近更新 更多