gpt4 book ai didi

java - 在 netty ChannelBuffer 中搜索字符串的最佳方法(不创建新字符串)?

转载 作者:行者123 更新时间:2023-11-30 09:22:49 24 4
gpt4 key购买 nike

我使用 Netty 实现了代理服务器,我在其中解码 HTTP 请求,然后根据它们的路径将这些请求写入传出 channel 。我需要从 HTTP 请求的内容中提取一些信息以供将来处理(基本上,找到“request-id:”形式的子字符串并记录下来以备后用。执行此操作的最佳方法是什么?显然,我可以将 channel 缓冲区的内容转储到字符串中并使用标准的 java 字符串搜索技术,但是在 netty 中是否有一种直接且低开销的方法可以在不创建新字符串的情况下执行此操作?例如,如果有类似ChannelBuffer 的 asCharSequence(CharSet) 方法,我可以只使用 java Pattern/Matcher。

最佳答案

不久前,我在尝试嗅探 ChannelBuffer 中包含的字节的内容类型时遇到了这个问题。

我想到你可以使用:

channelBuffer.toByteBuffer().asCharBuffer()

然后您可以将其传递给正则表达式 Pattern.Matcher,因为这不会重新分配缓冲区,而是它只是被包装并重新表示,就像它一样。但这不起作用,因为 CharBuffer 需要进行 Charset.decoded,这可能与将 ChannelBuffer 转换为字符串一样糟糕。

ChannelBufferIndexFinder 的问题之一是它在搜索一个特定字节时往往效果最好,而当您搜索字符串(或更基本的长度> 1 的字节数组)时,我无法按照我想要的方式让它工作。

我开始研究这个名为 ByteSequenceIndexFinder 的 ChannelBufferIndexFinder 实现这有助于在 ChannelBuffer 中找到实际的字节序列,但它有几个问题:

  1. 因为路途ChannelBuffer.bytesBefore(...)有效,它不返回定位数组的直接偏移量,而是返回它的结尾,因此您必须从返回的索引中减去 byte array length +1 以获得开头的偏移量字节缓冲区中的字节序列。
  2. 由于查找器必须保持状态(到目前为止匹配的字节数),所以它不是线程安全的。我尝试用 ThreadLocal 替换简单状态(一个 int),但性能大大降低,但它仍然是一个选项。

实际上有一种非标准的替代调用方法可以解决问题 #1,它的工作原理如下:

ChannelBuffer bufferToSearch = ...;
String searchStr = "....";
ByteSequenceIndexFinder finder = new ByteSequenceIndexFinder(searchStr.getBytes());
int startingOffset = finder.findIn(bufferToSearch);

startingOffset 是 channel 缓冲区中匹配字节序列的第一个字节的偏移量。

如果你需要这样的东西,希望它能对你有所帮助。 This是它的测试用例的开始。

关于java - 在 netty ChannelBuffer 中搜索字符串的最佳方法(不创建新字符串)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16306383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com