使用readDouble从套接字输入读取Double + EOL

时间:2012-09-10 20:09:51

标签: java android sockets datainputstream

好吧,我在这里绝望了。我一直在寻找这个问题的答案,现在进行了4个小时没有运气。这是我正在做的事情的要点。我有一个Android应用程序通过套接字连接到另一个设备。我的输出流正常工作(连接的设备可以正确接收我发送的字节值 - 所以如果我向设备发送10,它会看到10)。另一方面,我的应用程序每当向设备发送命令时都会收到输入。设备看到命令并发回一个结构为[DOUBLE + EOL]的数据包。 EOL特别是0x0A - '\ n'。

我能够在没有太多麻烦的情况下使用python。但是,我是一个非常新的Java,并没有完全弄清楚这一点。我现在尝试了很多东西并使用DataInputStream(socket.getInputStream())。我尝试使用BufferedReader,但我无法将字符串转换为我想要的双字符串。这是我试图开展工作的重要沟通代码:

if ( send_command( 40 ) )
{
    try {
        final double left_servo_pos = input_stream.readDouble();
        try {
            left_servo_pos_view.setText( Double.toString( left_servo_pos ) );
        } catch ( Throwable t ) {
            left_servo_pos_view.setText( t.toString() );
        }
    } catch ( UnknownHostException e ) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch ( IOException e ) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

命令“40”只是告诉设备发送上面指定格式的数据包。 catch ( Throwable t )现在只是一个替身,直到我弄清楚我正在使用什么(因此我可以有什么样的错误 - 最初这在我尝试使用Double时遇到了转换类型错误。 parseDouble())。

那么,现在发生了什么?我在TextView“left_servo_pos_view”中显示了许多不同的值。它们都以“e-312”为结尾,它告诉我.readDouble()方法只是在它通过时抓住一部分流(所以它正在获取我发送的实际Double值的一部分,而不是整件事。)

那是我的问题。我可以根据需要提供其他详细信息(我不确定还有什么对您有帮助)。正如我所说的,除了这部分外,一切似乎都在工作(这就是为什么我没有提供初始化代码或其他任何设置通信的功能)。我可以将input_stream类型更改为任何必要的(就像我说的,我已经尝试过没有太多运气的BufferedReader,现在我又回到了DataInputStream。

谢谢!

修改

我最终以完全不同的方式解决了这个问题。在对控制器的输出进行数据包捕获后,结果发现数据以“小端”方式出现(仍然不确定为什么,猜测控制器是如何实现的)。所以,我在网上找到了一个Little Endian InputStream类,我实现并几乎解决了这个问题。第一个值是正确的,然后在再次正确之前需要多8个值。所以,我认为数据包中有一些东西丢失,经过仔细研究后,最后会有一个额外的字节“00”。所以,我在代码中添加了“skipBytes(1)”,现在它正常工作。

1 个答案:

答案 0 :(得分:1)

要么您没有发送双重内容,要么与发件人不同步。我没有看到任何需要尾随\ n。我也不知道你在哪里消费它,当然使你你与发件人不同步。我会仔细检查你是否正在使用DataOutputStream.writeDouble()发送double,并从协议中完全删除\ n。