通过套接字整数 - 错误的字节

时间:2015-03-19 21:23:39

标签: java android network-programming tcl

我正在从我的PC上运行的Tcl脚本发送一个整数到在Android上运行的Java应用程序。

Tcl代码:

set bytes 10
set sock [socket localhost $port]
set binLen [binary format i $bytes]
puts "Sending size: $bytes"
puts $sock $binLen
flush $sock
close $sock

在Android端读取它的Java代码:

Socket clientSocket = ...; // socket created for connected Tcl script
InputStream inputStream = clientSocket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
byte[] sizeBuffer = new byte[4];
dataInputStream.readFully(sizeBuffer);

现在,当我在调试中预览sizeBuffer时,我发现它是:

sizeBuffer = {byte[4]@830050199072}
[0] = 13
[1] = 10
[2] = 0
[3] = 0

这似乎不太合适。我希望将它转换回整数:

int size = ByteBuffer.wrap(sizeBuffer).order(ByteOrder.LITTLE_ENDIAN).getInt();

但是它给出了2573,而不是10,这根据接收的字节是显而易见的。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您遇到的主要问题是puts默认会添加换行符(因为它的第一份工作是写出供人阅读的文字)。您平台的默认换行符序列是回车符/换行符。在编写二进制文件时,您应该做两件事:将通道置于二进制模式,而不是写额外的行终止符。

# Put the channel in binary mode
fconfigure $sock -translation binary
# Write without extra bytes
puts -nonewline $sock $binLen