使用 Java 的 RPC 和 UniData 模拟
RPC and UniData simulation using Java
我正在尝试为 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 website and this answer:
0xFF = 00000000 00000000 00000000 11111111(表示 32 位 int 值)
value & 0xFF = 将与 1 重叠的所有 0 替换为零,除了前 8 位
如果 this.headerBuffer[5] 评估为某个值,则可能会产生
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
当 (this.headerBuffer[5] & 0xFF) 计算时,<< 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
因此,所讨论的方法很可能是在寻找一些格式良好的 header 以在建立 RPC 连接时进行同步。我试图查看此 website 以了解我应该将哪种 header 作为我的服务器响应的一部分传递,以便 readHeaderLength() 方法有利于通信,但尚未找到明确的答案。
- 我对 readHeaderLength() 方法工作原理的理解是否正确?
- 我推断它最有可能寻找 RPC header 是否正确?
headerBuffer 字节数组在数组索引位置 4、5、6、7 中包含一个 4 字节的 int 值。readHeaderLength 方法只是将这 4 byte-array 字节的值转换为实际的 int使用移位操作键入值。
编辑:很可能这是来自套接字的输入流 header 的长度,在 header 开始流的 body 之后。我建议进一步研究该代码如何知道 "header length" 值存储在索引位置 4、5、6、7 中。它是在 RPC header 中定义的吗?
我正在尝试为 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 website and this answer:
0xFF = 00000000 00000000 00000000 11111111(表示 32 位 int 值)
value & 0xFF = 将与 1 重叠的所有 0 替换为零,除了前 8 位
如果 this.headerBuffer[5] 评估为某个值,则可能会产生 ... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
当 (this.headerBuffer[5] & 0xFF) 计算时,<< 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
因此,所讨论的方法很可能是在寻找一些格式良好的 header 以在建立 RPC 连接时进行同步。我试图查看此 website 以了解我应该将哪种 header 作为我的服务器响应的一部分传递,以便 readHeaderLength() 方法有利于通信,但尚未找到明确的答案。
- 我对 readHeaderLength() 方法工作原理的理解是否正确?
- 我推断它最有可能寻找 RPC header 是否正确?
headerBuffer 字节数组在数组索引位置 4、5、6、7 中包含一个 4 字节的 int 值。readHeaderLength 方法只是将这 4 byte-array 字节的值转换为实际的 int使用移位操作键入值。
编辑:很可能这是来自套接字的输入流 header 的长度,在 header 开始流的 body 之后。我建议进一步研究该代码如何知道 "header length" 值存储在索引位置 4、5、6、7 中。它是在 RPC header 中定义的吗?