我有使用Netty实现的代理服务器,在该服务器中,我解码HTTP请求,然后根据它们的路径将这些请求写入传出通道。我需要从HTTP请求的内容中提取一些信息用于将来的处理(基本上,找到一个“request-id:”形式的子字符串并记录以备后用。最好的办法是什么?显然,我可以将通道缓冲区的内容转储为一个字符串并使用标准的java字符串搜索技术,但是在netty中有没有一种简单而低成本的方式来做到这一点,而不创建一个新的字符串?例如,如果有像一个对于ChannelBuffer类型asCharSequence(CharSet)
方法,我可以只使用一个java模式/匹配器。为netty搜索一个字符串的ChannelBuffer的最佳方式(不用新建一个字符串)?
2
A
回答
2
前段时间我碰到这个问题,因为我试图嗅探一个ChannelBuffer中包含的字节的内容类型。
它发生,我认为你可以使用:
channelBuffer.toByteBuffer().asCharBuffer()
然后你可以传递给正则表达式Pattern.Matcher,因为这不会重新分配缓冲区,而只是被包装和重新代表,就像它一样。但是这不起作用,因为CharBuffer需要进行Charset.decoded,这可能与将ChannelBuffer转换为字符串一样糟糕。
ChannelBufferIndexFinder的其中一个问题是,当你搜索一个特定的字节时,当你搜索一个字符串(或者更基本上是一个长度大于1的字节数组)时,它往往工作得最好,我不能按照我想要的方式工作。
我开始在这家名为ByteSequenceIndexFinder ChannelBufferIndexFinder实现这有助于找到一个ChannelBuffer类型中的字节的实际顺序的工作,但有几个问题吧:
- 因为这样ChannelBuffer.bytesBefore(...)作品,它不会返回定位数组的直接偏移量,而是返回它的结尾,所以您必须从返回的索引中减去字节数组长度+1,以获取字节缓冲区内字节序列开始的偏移量。
- 由于查找器必须保持状态(迄今为止匹配的字节数),因此它不是线程安全的。我尝试用ThreadLocal替换简单状态(一个int),但性能大幅降低,但它仍然是一个选项。
实际上,有是非标准的那个地址问题#1的替代调用方法和它的工作原理是这样的:
ChannelBuffer bufferToSearch = ...;
String searchStr = "....";
ByteSequenceIndexFinder finder = new ByteSequenceIndexFinder(searchStr.getBytes());
int startingOffset = finder.findIn(bufferToSearch);
这startingOffset是内偏移匹配的字节序列的第一个字节通道缓冲区。
希望如果您需要这样的东西,它可能对您有所帮助。 This是它的测试案例的开始。
0
不能使用ChannelBuffer.indexOf(...),并通过一个ChannelBufferIndexFinder入法?
0
我使用以下实施ChannelBufferIndexFinder
在ChannelBuffer
搜索字符串:
public class StringFinder implements ChannelBufferIndexFinder {
private String string;
public StringFinder(String string) {
this.string = string;
}
@Override
public boolean find(ChannelBuffer buffer, int guessedIndex) {
if (buffer.writerIndex() - guessedIndex < string.length()) {
return false;
}
return string.equals(buffer.toString(guessedIndex,
string.length(), Charset.defaultCharset()));
}
}
相关问题
- 1. 最佳方式,如果一个字符串包含另一个字符串
- 2. 在c中搜索一个字符串的子字符串,然后创建一个新的字符串
- 3. 搜索一个字符串是否另一个字符串
- 4. 从字符串构造Netty ChannelBuffer
- 5. 寻找最佳的方式来搜索和替换另一个字符串中的字符串
- 6. 如何在一个字符串中搜索两个字符串?
- 7. 最佳搜索字符串中的子字符串java
- 8. 从Python中的另一个字符串搜索字符串
- 9. 搜索字符串的开始和在同一个字符串
- 10. 搜索一个子字符串的字符串
- 11. 不同于“X”的第一个字符的搜索字符串
- 12. 搜索一个字符串,添加一个字符串,并删除一个文件中的字符串
- 13. CSV:搜索字符串并用另一个字符串
- 14. 搜索一个字符串的斑点
- 15. Netty - 用换行符传输字符串的最佳方法?
- 16. 搜索一个字符串的子字符重音不敏感
- 17. 某个字符的搜索字符串
- 18. 搜索字符串一个ArrayList并返回另一个关联的字符串
- 19. 什么是增加一个字符串的最佳方式[jQuery]
- 20. 字符串的第一个字符和最后一个字符
- 21. 最优雅的方式来初始化一个字符串与另一个字符串中的单个字符
- 22. 从旧的字符串创建一个新的字符串
- 23. 反向类似字符串搜索列表的最佳方式
- 24. 在BeatifulSoup.findAll('a')中搜索字符串的最佳方式
- 25. 如何在另一个字符串中搜索字符串
- 26. 搜索字符串在一个字符串
- 27. 搜索特定字符串在另一个字符串
- 28. 为字符串创建一个新行
- 29. 将Netty中的DynamicChannelBuffer更改为字符串并返回到ChannelBuffer
- 30. 在一个字符串中搜索其他字符串的字符出现