【问题标题】:Reading Double + EOL from socket input using readDouble使用 readDouble 从套接字输入读取 Double + EOL
【发布时间】:2012-09-10 20:09:51
【问题描述】:

好吧,我在这里变得绝望了。我一直在寻找这个问题的答案,现在持续了 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)”,它现在可以正常工作了。

【问题讨论】:

    标签: java android sockets datainputstream


    【解决方案1】:

    要么您没有发送双份,要么您与发件人不同步。我认为不需要尾随 \n。我也看不到你在哪里消费它,这当然你与发件人不同步。我会仔细检查您是否使用 DataOutputStream.writeDouble() 发送双精度,并从协议中完全删除 \n。

    【讨论】:

    • 让我以此作为开头,我现在已经解决了我将在上面添加的问题。输入的问题是我无法使用“DataOutputStream”或任何Java,因为它在PLC上并使用通用套接字模块发送数据。不过,我也会考虑您对未来通信使用的建议。
    • @user1661109 正如我所说。你both (1) 没有发送一个双精度,至少不是 DataInputStream.readDouble() understands 的一个,并且 (2) 与发送者不同步,发送一个你没有消费的尾随 null .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2014-11-04
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多