2013-03-22 93 views
1

我正在嘗試編寫兩個Java程序。 一個模擬一臺服務器,一個模擬一個客戶端。如何通過套接字連接發送實例?

我怎麼能通過套接字發送一個Response類的實例?

Response類表示服務器連接的狀態碼。例如404未找到等

我不能不幸,使用序列化。

任何意見將不勝感激。

+0

你總是需要某種序列化。確切的約束是什麼? – 2013-03-22 15:41:08

+0

「我不允許使用序列化」是什麼意思?肥皂? XML? JSON?你不能寫你自己的客戶序列化程序?要通過線路傳輸,數據*必須*以*某種方式序列化。 – 2013-03-22 15:42:35

+0

您不允許使用Java序列化?爲什麼?你可以使用自定義序列化(比如說,字符串流上的JSON)?此外,你應該考慮改變問題的標題(是誤導,應該說是實例,而不是類) – nMoncho 2013-03-22 15:42:54

回答

3

在某些級別必須進行序列化才能通過連接發送對象。我只能假設你關於不允許使用序列化的評論是指不能使用Serializable而不是一系列的禁止序列化(這是沒有意義的)。一個非常簡單的方法就是使用外部序列化庫,如gson。 Gson將一個對象序列化爲一個JSON字符串,您可以通過套接字傳輸該字符串,然後使用同一個庫將其反序列化回另一端的對象。你當然可以用你喜歡的格式使用任何你喜歡的序列化庫,例如。 XML,json,YAML,...

+0

剛看了Gson,我正在下載zip文件。它似乎正是我想要的。謝謝 – James 2013-03-22 16:01:26

1

您不會發送Response類本身的實例。當通過網絡發送東西時,客戶機和服務器機器理解字節。你的應用程序可以理解比字節更多的東西,它可以理解特定的表示。例如,您的服務器可能會派出Response類象的JSON表示:

{ 
    "response" : { 
     "code":404 
    } 
} 

那麼你的客戶端必須能夠了解哪些字節序列表示。這基本上就是一個協議:兩臺機器如何進行通信。

無論用什麼語言編寫服務器或客戶端,Response都是一個實體。在Java中,您可以使用Class來表示它,在C++中,您可以使用struct。但是,兩者都需要知道,當您與外部應用程序系統進行通信時,他們必須將其置於每個人都能理解的格式,無論是json,xml還是其他任何格式。

至於通過socket發送此,甲骨文有一個很好的tutorial here。您從套接字獲取OutputStream 並開始編寫您的表示。