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 から着想を得たカスタムの 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 に答える