2012-09-04 172 views
2

我在套接字上使用ObjectOutputStream,因爲我創建了需要在客戶端和服務器之間傳輸的新類。 我還創建了一個獨特的線程,每隔一秒將一個字節發送到服務器,以便連續檢查連接並檢查它是否存活。Java - 通過套接字發送字節對象

byte b=1; 
oos.writeObject(b); 

我使用「字節」,因爲它是我可以發送的最小的對象(右?),以便服務器不會讀取更長的對象。

我的問題是如果服務器讀取一個字節對象(字節的大小)或一個8字節的對象(對象的大小) ?

+0

一個字節是*不是您可以發送的最小對象;有一點是。一個字節由8位組成。布爾值相當於字節。使用'writeObject'將導致類,類簽名和可序列化字段被寫入到流中,所以大小會有所不同;我建議你自己測試一下Byte對象的情況。 – Vulcan

+0

你的意思是一個對象大小是8字節? –

+0

如何發送一個位? – Onca

回答

2

可能既不。首先,將byte自動裝箱到Byte。然後將Byte序列化爲您的輸出流。它可能需要比8個字節多一點發送。我完全不知道規範,但它可能會發送類名java.lang.Byte和字節本身,再加上可能還有幾個控制字節。

一個簡單的方法來告訴 - 將您的字節序列化爲ByteArrayOutputStream,刷新您的ObjectOutputStream,然後查看您的ByteArrayOutputStream結尾的字節數。

+0

'writeObject'發送類名,類簽名,對象的可序列化值和流頭。你說「不」,所以+1是正確的。 – Vulcan

+0

好吧很有意思。謝謝 – Onca

1

如果您必須使用ObjectOutputStream,則發送哪個對象並不重要,因爲在發送第一個對象之後,將來會發送對該對象的引用。出於這個原因,我建議你發送一個特定的枚舉類似。

enum Control { 
    HEARTBEAT 
} 

您可以使用DataOutputStream更小的連線格式,其中1個字節是一個字節。鑑於IP數據包頭大約爲20個字節,發送1個字節或8個字節並不重要,因爲開銷遠高於此值。