Android中的Java套接字处理与其他平台上的不同?
我的处境很奇怪。我将我的Java软件与一个设备连接起来,我们称之为“黑匣子”(因为我无法查看它或在其中进行跟踪)。我正在处理一个特定端口(5550),并在套接字上以字节序列的形式发送命令。结果,我从同一插座上的黑盒子中得到了答案。 我的命令和回复都以预定义的方式(根据API)加上前缀,并具有XOR校验和 当我从Windows运行代码时,一切正常:命令1得到它的回复1,命令2得到它的回复2 当我从Android运行代码时(这实际上是我的目标——Windows开始跟踪错误),它变得很奇怪:命令1得到了回复1,但命令2没有。当我使用命令2(非法更改前缀,违反校验和)时,黑盒会按预期反应(返回错误)。但由于Android发出了正确的命令2,回复完全是错误的:错误的前缀和缺少校验和 在尝试分析错误的过程中,我尝试了WireShark,这表明在网络接口上,黑盒发送的是正确的回复2,但是从套接字用Java评估这个回复是错误的。当命令/回复1一切正常时,这怎么可能 奇怪的是,部分预期数据出现了: 预计:ff fe e4 04 00 11 00 f1 已接收:fd04 00 11 00//缺少字节8 我附加的最低限度的代码,以迫使问题。什么可以伪造我收到的字节?Java中是否存在对套接字的“原始”访问,这可能会暴露问题 我完全糊涂了,希望您能提供帮助:Android中的Java套接字处理与其他平台上的不同?,java,android,sockets,Java,Android,Sockets,我的处境很奇怪。我将我的Java软件与一个设备连接起来,我们称之为“黑匣子”(因为我无法查看它或在其中进行跟踪)。我正在处理一个特定端口(5550),并在套接字上以字节序列的形式发送命令。结果,我从同一插座上的黑盒子中得到了答案。 我的命令和回复都以预定义的方式(根据API)加上前缀,并具有XOR校验和 当我从Windows运行代码时,一切正常:命令1得到它的回复1,命令2得到它的回复2 当我从Android运行代码时(这实际上是我的目标——Windows开始跟踪错误),它变得很奇怪:命令1得到
String address = "192.168.1.10";
int port = 5550;
Socket socket;
OutputStream out;
BufferedReader in;
try {
socket = new Socket(address, port);
out = socket.getOutputStream();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// This is "Command 1" which is receiving the right reply
// byte[] allesAn = new byte[] {(byte)0xff, (byte)0xfe, (byte)0x21, (byte)0x81, (byte)0xa0};
// out.write(allesAn);
// This is "Command 2" which will not receive a right reply
byte[] getLokInfo3 = new byte[] {(byte)0xff, (byte)0xfe, (byte)0xe3, (byte)0, (byte)0, (byte)3, (byte)0xe0};
out.write(getLokInfo3);
out.flush();
while (true) {
String received = "";
final int BufSize = 1000;
char[] buffer = new char[BufSize];
int charsRead = 0;
charsRead = in.read(buffer, 0, BufSize);
// Convert to hex presentation
for (int i=0; i < charsRead; i++) {
byte b = (byte)buffer[i];
received += hexByte((b + 256) % 256) + " ";
}
String result = charsRead + ">" + received + "<";
Log.e("X", "Read: " + result);
}
} catch (Exception e) {
Log.e("X", e.getMessage() + "");
}
以下是wireshark所说的,显示了预期的8个字节:
您确定您的黑匣子使用flush()吗?如果没有,那就可以解释情况了不幸的是,我不知道答案。您能否提供有关运行代码的环境的更多信息,包括windows和android版本以及硬件规格?可能有用。您确定您的黑盒使用flush()吗?如果没有,那就可以解释情况了不幸的是,我不知道答案。您能否提供有关运行代码的环境的更多信息,包括windows和android版本以及硬件规格?可能有用。
private static String hexByte(int value) {
String s = Integer.toHexString(value);
return s.length() % 2 == 0 ? s : "0" + s;
}