2

我需要一些帮助来使用消息的第一个字节来识别响应的长度。

目前使用 JMeter 发送一些 TCP 请求,但不幸的是它无法确定消息的结束,所以它挂起。

通信协议是 Google Protobufs(协议缓冲区)并且没有确定消息结束的指示器。

以下是Jmeter所拥有的。如果有人能告诉我如何在此基础上进行构建,我将不胜感激,这样我就可以使用响应的第一个字节来测量消息的长度。

JMETER - 读取方法。

public String read(InputStream is) throws ReadException {
    ByteArrayOutputStream w = new ByteArrayOutputStream();
    try {
        byte[] buffer = new byte[127];
        int x = 0;
        while ((x = is.read(buffer)) > -1) {
            w.write(buffer, 0, x);
            if (useEolByte && (buffer[x - 1] == eolByte)) {
                break;
            }
                }
        IOUtils.closeQuietly(w); // For completeness
        final String hexString = JOrphanUtils.baToHexString(w.toByteArray());
        if(log.isDebugEnabled()) {
            log.debug("Read: " + w.size() + "\n" + hexString);
        }
        return hexString;
    } catch (IOException e) {
            throw new ReadException("", e, JOrphanUtils.baToHexString(w.toByteArray()));
    }
}
4

3 回答 3

1

先读这个:

然后,如果您要发送一些指示行尾的自定义字符,请在协议中尝试在 jmeter.properties 中取消注释:

  • tcp.eolByte=

如果您在消息开始时发送长度,请使用:

如果这对您来说还不够,那么编写一个扩展AbstractTCPClient的新 ClientImpl 。

问候

菲利普·M

于 2012-09-14T19:24:16.547 回答
1

在这种情况下,长度包含在响应的第一个字节中,解决方案是编写一个自定义的 LengthPrefixedBinaryTCPClientImpl 灵感来自

使用以下读取方法:

public String read(InputStream is) throws ReadException {
    ByteArrayOutputStream w = new ByteArrayOutputStream();
    try {
        int mLen = readUnsignedInt(is);
        for (int i = 0; i < mLen ; i++) {
            int nByte= is.read();
            w.write(nByte);
        }  // carry on

……

确定消息的长度。(记住小端和大端)

public static int readUnsignedInt(InputStream in) throws IOException {
    int b = in.read();
    int i = b & 0x7F;
    for (int shift = 7; (b & 0x80) != 0; shift += 7) {
        b = in.read();
        i |= (b & 0x7FL) << shift;
    }
    return i;
}

然后将该类打包为 JAR 并放入:

  • /lib/ext
于 2012-09-17T16:11:27.570 回答
0

不读取输入流中内容的大小是不可能的。

于 2012-09-14T17:16:15.080 回答