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

基于解码消息设置netty响应编码

巴博耘
2023-03-14

我正在编写一个netty TCP服务器,它必须根据请求中的resseType值对响应进行编码,例如返回pro buf或JSON。建议的实现方法是什么?

我们的服务器有一个带有解码器、编码器和处理程序的管道。

pipeline.addLast(new RequestDecoder<Request>())
pipeline.addLast(new ResponseEncoder<Response>())
pipeline.addLast(new Handler<Request, Response>())

我考虑使用解码器将正确的编码器添加到管道中,如下所示

pipeline.addLast(new RequestDecoder<Request>())
pipeline.addLast(new ResponseEncoder<Response>())
pipeline.addLast(new Handler<Request, Response>())

class RequestDecoder<Request> {
  public void decode(...) {
    if (request.responseType().equals("protobuf")) {
      ch.pipeline().replace(ResponseEncoder.class, "protobuf", new ProtobufResponseEncoder<Response>());
    } else {
      ch.pipeline().replace(ResponseEncoder.class, "protobuf", new JsonResponseEncoder<Response>());
    }
  }
}

这似乎有效,但是否正确?ChannelHandler文档使我想到了这个设计。

可以随时添加或删除通道处理器,因为通道管道是线程安全的。例如,可以在将要交换敏感信息时插入加密处理程序,并在交换后将其删除。

通道可能是线程安全的,但通道会串行处理请求吗?如果不是,如果它在完成第一个请求之前启动第二个请求,那么第一个请求的响应是否会使用第二个请求的编码器?

或者,我可以用协议对象< code>RequestDecoder包装请求

共有1个答案

毛德华
2023-03-14

通道可能是线程安全的,但是通道会串行处理请求吗?

Netty不理解通道上固有的请求/响应的概念,除非您添加了一个理解您的协议的处理程序。在您的情况下,它是您添加的编码器/解码器。Netty将从通道读取数据,并按照可用的顺序将其发送到管道上。除此之外的顺序由处理程序完成,例如:处理程序可以决定异步处理这些消息,然后乱序写入它们。

如果不是,如果它在完成第一个请求之前启动第二个请求,那么第一个请求的响应是否会使用第二个请求的编码器?

是的,如果请求/响应是相互分开的,则不应修改管道,假定它们是有序的。

对于您的情况,我建议让两个处理程序都在管道中,让它们有条件地处理消息,否则通过管道传递消息。或者,您可以有一个基于类型对消息进行编码的处理程序。

 类似资料:
  • 在HttpServletResponse接口中定义了若干设置HTTP响应消息头的方法,如addHeader方法可以添加响应消息头字段;addIntHeader方法可以添加整数值的响应消息头字段;setContextType方法可以设置Context-Type字段值。 HTTP响应消息头是由若干key-value对组成的,其中key表示字段名,value表示字段值,中间用冒号(:)分隔。如下面的内容

  • 我是JMeter的新手,正在尝试使用JMeter和SMTP发送HTTP请求和电子邮件。 我将JMeter错误作为非HTTP响应代码: < code > Java . net . socket exception/Non HTTP响应消息:连接重置 SMTP错误为500/ 我已完成以下设置: user.properties: hc。参数: 这些更改仍然没有解决我的问题。你能帮助我在哪里更改设置来解决

  • 问题内容: 我正在使用并且需要设置响应编码(由于某种原因,服务器在Content- Type中返回了错误的编码)。我的方法是将响应作为原始字节获取,并以所需的编码转换为。我想知道是否有更好的方法(例如,设置HttpClient)。感谢您的建议。 问题答案: 我认为使用3.x API 没有更好的答案。 HTTP 1.1规范清楚地表明,客户端“必须”遵守响应头中指定的字符集,如果未指定任何字符集,则使

  • 我正在使用 Jmeter 执行一个脚本进行负载测试。我在两者之间遇到错误,例如。如果我应用了500users的负载,直到250个用户线程成功运行,那么错误来自连接超时错误。然后,它再次运行成功为某些线程,然后出错。 代码如下:- 响应标头: 我需要破坏服务器。 有人能帮我吗?

  • 记录的Blazemeter脚本在JMeter中不工作,出现以下错误消息。 响应代码:非HTTP响应代码:java.net。SocketException响应消息:非HTTP响应消息:软件导致连接中止:recv失败

  • 我们有一个运行在Websphere 8.5.5上的基于SOAP over JMS的web服务。web服务接收MQ请求消息,处理请求并发回响应。一切都好。 现在,我们需要在MQ响应消息上设置JMSExpirationTime,以便如果调用应用程序没有在“指定时间”从队列中读取响应,那么消息应该过期,并且不应该永远留在队列中。 Web服务是基于JAX-RPC的SOAP over JMS。我们的SOAP