2015-07-10 165 views
0

我對java套接字編程比較新,想通過tcp套接字從Floatbuffer變量發送數據。這應該在android平臺上運行。Java通過tcp套接字有效地發送floatbuffer

下面是一些代碼來說明什麼,我想做的事:

FloatBuffer buf = FloatBuffer.allocate(4); 
buf.put(5.5f); 
buf.put(1.5f); 
buf.put(2.5f); 
buf.put(3.5f); 

ServerSocket server = new ServerSocket(38300); 
con = server.accept(); 

// somehow send the whole buf variable over the tcp socket 

我相信你可以提取每一個浮動和單獨寄過去的插座,但我不知道是否有做更有效的方式所以?

+0

我不明白你是如何發送你的數據的 - 所以很難分辨你的問題與'更高效'是...你能詳細說明你的問題嗎? –

回答

1

如何爲它創建一個支持ByteBuffer。這樣,您就如何通過網絡傳輸數據有很多選擇。隨着SocketChannel你會得到它這樣簡單。

ByteBuffer buf = ByteBuffer.allocate(floats*4); 
FloatBuffer floats = buf.asFloatBuffer(); 
floats.put(5.5f); 
... 
ServerSocket server = new ServerSocket(38300); 
SocketChannel sc = server.accept().getChannel(); 
sc.write(buf); 
+0

我今天試了這個,但我得到的錯誤:嘗試調用空對象引用虛擬方法'int java.nio.channels.SocketChannel.write(java.nio.ByteBuffer)' –

+0

聽起來像你的'ByteBuffer'是空值。你完全按照這個代碼嗎? – Kayaman

+0

它是空的sc對象,但讓它在這個例子後面工作http://tutorials.jenkov.com/java-nio/server-socket-channel.html –

1

高效溶液在通過網絡發送的數據的量方面被直接發送浮子。

每個浮點數都是32位長度,如果需要發送浮點數,則不可能減少它。

另一種不一定適用的方法是使用不同的類型發送較少的位。

例如,而不是發送

5.5f 
1.5f 
2.5f 
3.5f 

爲什麼不乘以10它們只發送byteshort元?

在燈座的另一側可以通過10.0

重建浮子除以字節(或短)對於這種溶液可以保存4倍(對於字節)或2x(簡稱)在通過網絡發送的位的條款

注:,如果你知道可能的數據的範圍限制在同一已知值可以應用該解決方案。作爲一個例子,發送0到10之間的值和一個十進制數字。

+0

如果他需要發送'5.57f'而不是? – Kayaman

+0

有必要查看要發送的數據值的範圍。有時候從浮點數傳遞到字節或從浮點數傳遞到short可能有時不成立。 –

+0

總的來說不是,所以這不是一個很好的答案。 – Kayaman

相關問題