我正在尝试为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和this answer:
价值&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()方法支持通信,但还没有找到明确的答案。
答案 0 :(得分:1)
headerBuffer字节数组在数组索引位置4,5,6,7中包含一个4字节的int值.readHeaderLength方法只是使用位移操作将这4个字节数组的字节值转换为实际的int类型值。
编辑:在标题开始流的主体之后,很可能这是来自套接字的输入流标题的长度。我建议更多地研究代码如何知道标题长度&#34; value存储在索引位置4,5,6,7中。是否在RPC头文件中定义了