使用Java

时间:2016-12-06 17:54:37

标签: java rpc unidata

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

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值)
  • 价值&amp; 0xFF =将与1s重叠的所有0替换为零,除了前8位

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

  • 当(this.headerBuffer [5]&amp; 0xFF)评估时,&lt;&lt; 16将向右添加16个零。

那么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标头?

1 个答案:

答案 0 :(得分:1)

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

编辑:在标题开始流的主体之后,很可能这是来自套接字的输入流标题的长度。我建议更多地研究代码如何知道标题长度&#34; value存储在索引位置4,5,6,7中。是否在RPC头文件中定义了