当前位置: 首页 > 知识库问答 >
问题:

Netty 4.0-StringDecoder和ChannelInbnMessageHandlerAdapter不工作

钮巴英
2023-03-14

我正在使用netty 4.0.0-CR3,遵循服务器端的示例:https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetServerPipelineFactory.java

我的管道建设如下:

private static final StringDecoder DECODER = new StringDecoder(CharsetUtil.UTF_8);

@Override
public void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline pipeline = ch.pipeline();
    pipeline.addLast("decoder", DECODER);
    // and then business logic
    pipeline.addLast("serverHandler", new ServerHandler());
}

和处理程序:

public class ServerHandler extends ChannelInboundMessageHandlerAdapter<String> {

private static final Logger LOGGER = LoggerFactory.getLogger(ServerHandler.class);

public void messageReceived(ChannelHandlerContext ctx, String request)
        throws Exception {
    // Displays the message
    LOGGER.info("Received: " + request);
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
        throws Exception {
    LOGGER.error("Unexpected exception from downstream.", cause);
    ctx.close();
}

}

我创建了一个简单的C#客户端,将字符串编码为字节,并发送到服务器。然而,我没有看到调用StringDecoder的decode()或handler的messageReceived()。

然后我删除了管道中的StringDecoder(),并将处理程序更改为:

public class Handler extends ChannelInboundByteHandlerAdapter {

@Override
protected void inboundBufferUpdated(ChannelHandlerContext ctx, ByteBuf in)
        throws Exception {
    System.out.println("called " + in.toString(CharsetUtil.UTF_8));

}

}

现在它工作正常。从功能上讲,两条管道都应该正常工作?为什么第一个设置不起作用?客户端代码相同。

非常感谢!

共有2个答案

公冶鸣
2023-03-14

谢谢大家!所以我添加了以下内容:

pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter()));

直到我在C#中显式地将“\0”添加到字符串的末尾,这仍然不起作用:

ASCIIEncoding encoder = new ASCIIEncoding();
int index = random.Next(0, 2);
byte[] buffer = encoder.GetBytes(list[index] + "\0");

奇怪的是,我之前使用的是Netty 3.6,即使没有FrameDecoder(只有StringDecoder存在/客户端代码是相同的),一切都很好,但现在我必须执行上述步骤才能使其工作。。。。。。。。。。?

党博超
2023-03-14

StringDecoder的留档明确指出,如果通过流连接(例如TCP)使用,它必须与ByteToMessageDecoder结合使用。您引用的示例在StringDecoder前面有这样的处理程序。

 类似资料:
  • 伙计们,你们能帮帮忙吗 所以我正在尝试显示我从后端获得的数据,但似乎 *ngFor 不起作用,只想返回启用的大小如何使用 ngIf 这是模板 这是我得到的数据(我正在循环的部分) 所以我需要显示每个尺寸的价格,然后减去折扣,如果未启用,则显示隐藏该尺寸。

  • 我正在使用Tomcat8作为Spring Boot项目的一部分,我的acceptCount设置似乎不起作用。我的服务器不是只接受300个连接,而是接受了我扔给它的近1000个连接,当然同时处理的连接不超过200个。 Tomcat文档在AcceptCount上似乎很清楚:“当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当队列满时接收的任何请求都将被拒绝。”但显然这不会发生。 当然还

  • 我正在做一个窗口,有一个大的文本区域和一个小的文本区域下。这是我到目前为止得到的: 这是我的代码: 我如何使较大的textarea部分透明,这样我就可以看到背景,我如何移动“比如说:”到较小的textarea前面?

  • 请参阅代码。 > 当我调用方法@Async loadMarkUpPCT()时,数据没有提交到表中。它表现得好像是非牵引的。 当我从loadMarkUpPCT(类1)中删除@Async(即非异步)时,数据被提交并按预期正常:事务性) 我希望@Async和@Transactional的结果是一样的,但事实并非如此。请解释一下,我做错了什么? 编辑:我刚编辑过代码日志 流程方面:AppDataLoade

  • 我正在尝试连接多多边形(geom)和点(拾取),以便可以找到自治市镇中的拾取器数量。我正在使用下面的代码,但它超时并且不返回任何内容。我也尝试了ST_Contains什么都不返回。想法将不胜感激。谢谢。 以下是数据示例。拾取数据类型为“几何体(点,4326)”,而geom数据类型为几何体(多边形,4326”。geom变量是一个非常长的字符串,因此我不能在不超过字符限制的情况下为它发布多个数据点。

  • 我正在尝试从WepApi2控制器获取json响应 使用此项尝试获取数据。。。 我得到了这个... 阻止跨源请求:同一源策略不允许读取位于的远程资源https://api.mysite.com/api/Data/GetData.(原因:CORS标头“Access Control Allow Origin”与“*”不匹配) 我已经在网络上搜索了几乎所有我能找到的关于CORS和jQuery的信息,但我不