2009-10-08 139 views
0

將消息格式化爲服務器的最佳方式是什麼?當我使用二進制格式化器對一個對象進行serilising然後將其發送到服務器時。通過套接字發送序列化對象

在服務器結束其在收聽一個異步方式,然後當收到的緩衝區大小是不是100%它假定傳輸已經完成。

這是工作的那一刻,我可以在另一端deserialise對象,我只是擔心,如果我開始發送異步此方法將失敗,有消息的可能模糊。

我知道,我需要以某種方式將郵件標記爲說這是一個消息的最後,這等位屬於消息2,但我不能確定正確的方法來做到這一點。

任何人都可以指出我在正確的方向,也許給我一些例子?

感謝

回答

2

你總是可以把它序列化到內存流,看看它到底有多大,發送長度爲4個字節的二進制數,然後發送流的內容。

在另一邊你可以坐等4個字節,將它們組合成一個整數,然後坐下來,等待的字節數。

當你讀的函數返回(使其阻塞讀),你知道你有整個對象到一個緩衝區,所以你只要反序列化,並將其轉換爲您共同的接口類型。

編輯:這是你的具體問題的答案。這就是說你最好使用比純粹的tcp更高級別的庫。

+0

我使用套接字的原因是因爲需要檢測客戶端何時斷開連接。 – RubbleFord 2009-10-08 08:04:36

+0

在這種情況下,在發送數據包之前發送「數據包」大小,這總會大大簡化事情。機會是你甚至不會感覺到,你的對象的大小是4字節嗎? – Blindy 2009-10-08 11:07:06

1
  1. 如果你的對象有可以接受的另一端字節的規定量,然後創建你的對象固定長度。
  2. 否則,您可以在對象之間發送分隔符(符號或您在對象中未使用的符號序列),並逐字節地繼續讀取接收到的數據,直到看到分隔符爲止。
+0

對象不固定長度我不能使用選項1,因爲它是通過二進制格式化程序的選項,我不確定什麼是安全分隔符。 – RubbleFord 2009-10-08 07:48:32

相關問題