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

Netty、Strings和flushing

史意致
2023-03-14

我正在尝试调整示例Netty代理,使其能够修改途中的一些内容。

我在FTP客户端和服务器之间代理,所以行以CRLF结尾——这很重要。我还没有对FTP数据端口做任何事情,所以这不是一个因素。

我从这个示例代码开始:https://netty.io/4.0/xref/io/netty/example/proxy/package-summary.html

... 它建立了这样一个管道:

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

...这很好。

如果我添加一个新的LineBasedFrameDecoder(maxLen)ftp客户端将挂起等待服务器,因为代理已剥离CRLF,而服务器仍在等待。我可以通过告诉帧解码器不要删除分隔符来解决这个问题:newlinebasedFrameDecoder(maxLen,false,false)

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new LineBasedFrameDecoder(maxLen, false, false),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

到目前为止,一切都好。但是如果我添加一个String解码器,我会得到同样的挂起症状,这次是因为StringDecoder之后的管道步骤没有被调用。

ch.pipeline().addLast(
      new LoggingHandler(LogLevel.INFO),
      new LineBasedFrameDecoder(maxLen, false, false),
      new StringDecoder(StandardCharsets.UTF_8),
      // aim is for my own string rewriter to go here
      new StringEncoder(StandardCharsets.UTF_8),
      new HexDumpProxyFrontendHandler(remoteHost, remotePort));

在调试器中,StringEncoder中的断点。encode()不会触发。

解码后如何让Netty处理字符串?

共有1个答案

边银龙
2023-03-14

StringEncoder是一个出站通道适配器。它的目的是在编写时将字符串转换为ByteBuf,所以我不希望对入站数据调用encode。

为了使您的代码工作,您需要用一个入站通道适配器替换StringEncoder,该适配器在读取时从String转换为ByteBuf。我怀疑Netty库中是否存在任何这样的编解码器,因为解码器通常从较低级别的格式转换为较高级别的格式,而不是相反。

由于LineBasedFrameDecoder发出ByteBuf的,而HexDumpProxyFrontendHandler使用ByteBuf,我建议您删除StringDecoder和StringEncoder,并插入客户重写器。但是让它成为一个ByteBuf到ByteBuf的解码器。在解码器中,您可以将传入的ByteBuf转换为字符串,完成工作,然后将其转换回ByteBuf,然后通过管道传递。

 类似资料:
  • Elixir中的字符串插入双引号之间,它们以UTF-8编码。 与C和C ++不同,默认字符串是ASCII编码的,只有256个不同的字符,UTF-8由66536 code points 。 这意味着UTF-8编码由许多不同的可能字符组成。 由于字符串使用utf-8,我们也可以使用符号:ö,ł等。 创建一个字符串 要创建字符串变量,只需将字符串赋值给变量 - str = "Hello world"

  • Fortran语言可以将字符视为单个字符或连续字符串。 字符串的长度可以只有一个字符,或者甚至可以是零长度。 在Fortran中,字符常量在一对双引号或单引号之间给出。 内在数据类型character存储字符和字符串。 字符串的长度可以由len specifier 。 如果未指定长度,则为1.您可以按位置引用字符串中的单个字符; 最左边的字符位于第1位。 字符串声明 声明字符串与其他变量相同 -

  • 作为一种基本数据结构,每种语言都有一些对于字符串的预定义处理函数。Go 中使用 strings 包来完成对字符串的主要操作。 4.7.1 前缀和后缀 HasPrefix 判断字符串 s 是否以 prefix 开头: strings.HasPrefix(s, prefix string) bool HasSuffix 判断字符串 s 是否以 suffix 结尾: strings.HasSuffix(

  • String对象允许您使用一系列字符; 它使用许多辅助方法包装Javascript的字符串原始数据类型。 由于JavaScript自动在字符串基元和String对象之间进行转换,因此可以在字符串基元上调用String对象的任何辅助方法。 语法 (Syntax) 使用以下语法创建String对象 - var val = new String(string); String参数是一系列已正确编码的字

  • 在R中的一对单引号或双引号内写入的任何值都被视为字符串。 内部R将每个字符串存储在双引号内,即使您使用单引号创建它们也是如此。 字符串构造中应用的规则 字符串开头和结尾的引号应该是双引号或双引号。 他们不能混在一起。 双引号可以插入到以单引号开头和结尾的字符串中。 单引号可以插入到以双引号开头和结尾的字符串中。 双引号不能插入以双引号开头和结尾的字符串中。 单引号不能插入以单引号开头和结尾的字符串

  • 字符串是一系列字符,可以包含字母,数字,特殊字符或所有字符。 如果变量用双引号“”括起来,则称该变量为字符串。 语法 (Syntax) variablename = "string" 例子 (Examples) str1 = "string" ' Only Alphabets str2 = "132.45" ' Only Numbers str3 = "!@#$;*" ' Only S