Android中的Java套接字处理与其他平台上的不同?

Android中的Java套接字处理与其他平台上的不同?,java,android,sockets,Java,Android,Sockets,我的处境很奇怪。我将我的Java软件与一个设备连接起来,我们称之为“黑匣子”(因为我无法查看它或在其中进行跟踪)。我正在处理一个特定端口(5550),并在套接字上以字节序列的形式发送命令。结果,我从同一插座上的黑盒子中得到了答案。 我的命令和回复都以预定义的方式(根据API)加上前缀,并具有XOR校验和 当我从Windows运行代码时,一切正常:命令1得到它的回复1,命令2得到它的回复2 当我从Android运行代码时(这实际上是我的目标——Windows开始跟踪错误),它变得很奇怪:命令1得到

我的处境很奇怪。我将我的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中是否存在对套接字的“原始”访问,这可能会暴露问题

我完全糊涂了,希望您能提供帮助:

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; 
}