【问题标题】:RPC and UniData simulation using Java使用 Java 进行 RPC 和 UniData 模拟
【发布时间】:2016-12-07 02:19:10
【问题描述】:

我正在尝试为 RPC 服务器编写一个模拟器,以便可以使用 UniData Java 库。如果我反编译他们的 api,我会看到这个 sn-p 代码。

private byte[] headerBuffer;

private int readHeaderLength() {
    return ((this.headerBuffer[4] & 0xFF) << 24) + 
    ((this.headerBuffer[5] & 0xFF) << 16) + 
    ((this.headerBuffer[6] & 0xFF) << 8) + 
    ((this.headerBuffer[7] & 0xFF) << 0);
  }

headBuffer 属性被填充如下:

final Socket socket = new Socket("127.0.0.1", 31438);
final DataInputStream dataIn = new DataInputStream(socket.getInputStream());
dataIn.readFully(this.headerBuffer);

通过挖掘,这部分代码似乎负责初始化与某个服务器的 RPC 连接。

为了模拟这个,我创建了一个监听这个端口的服务器,并打开输出流,如下:

@Override
public void run() {
    try {
        final DataInputStream dataIn = new DataInputStream(socket.getInputStream());
        final DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
        final String connectionResponse = "SIMULATED_CONNECTION";
        dataOut.write(connectionResponse.getBytes());
        System.out.println("#### message sent");
        while (true) {
            final byte[] data = new byte[1024];
            dataIn.readFully(data);
            final String input = new String(data);
            if (input == null || input.equals(".")) {
                System.out.println("### the input line is " + input);
                break;
            }
            System.out.println("## received message " + input);
        }
    } catch (final IOException e) {
        System.out.println("Error handling request : " + e.getMessage());
    } finally {
        try {
            socket.close();
        } catch (final IOException e) {
            System.out.println("## cant close socket " + e.getMessage());
        }
    }
}

但是,我终其一生都无法弄清楚 readHeaderLength() 实际试图从连接中检索什么。虽然我可以看到反编译的代码,但这是我理解它试图解析的内容的最佳尝试。我在看this websitethis answer

  • 0xFF = 00000000 00000000 00000000 11111111(表示 32 位 int 值)

  • value & 0xFF = 将所有与 1 重叠的 0 替换为 0,除了前 8 位

  • 如果 this.headerBuffer[5] 评估为某个值,则可能会产生 ... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101

  • 当 (this.headerBuffer[5] & 0xFF) 求值时,

那么 this.headerBuffer[] 实际上可以包含什么?

如果我写一些简单的东西,比如:

final String data = "sample";
final byte[] bytes = data.getBytes();
for (final byte bit : bytes) {    
    System.out.println(bit);
}

我得到以下输出: 115 97 109 112 108 101

因此,所讨论的方法很可能是在建立 RPC 连接时寻找一些格式良好的标头以进行同步。我试图查看这个website 以了解我应该传递什么样的标头作为我的服务器响应的一部分,以便 readHeaderLength() 方法有利于通信,但尚未找到明确的答案。

  • 我对 readHeaderLength() 方法工作原理的理解是否正确?
  • 我推断它最有可能在寻找 RPC 标头是否正确?

【问题讨论】:

    标签: java rpc unidata


    【解决方案1】:

    headerBuffer 字节数组在数组索引位置 4、5、6、7 中包含一个 4 字节 int 值。readHeaderLength 方法只是使用位移操作将这 4 个字节数组字节值转换为实际的 int 类型值。

    编辑:很可能这是来自套接字的输入流的标头的长度,在标头开始流的主体之后。我建议进一步研究该代码如何知道“标头长度”值存储在索引位置 4、5、6、7 中。是否在 RPC 标头中定义?

    【讨论】:

    • 我不能说为什么它关心那些特定的元素。试图找到 RPC 标头与回答这个问题一样困难。天知道这个文件在哪里消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2015-12-16
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多