2014-05-10 135 views
0

我必須從客戶端向服務器端發送一個Person類的對象,但是在服務器中沒有類Person,怎麼辦? Person的屬性是nome和cognome。如何從客戶端向服務器發送對象?

// CLIENT

 Socket sock = new Socket("localhost",10000); 
     ObjectOutputStream outToClient = new ObjectOutputStream(sock.getOutputStream()); 
     String nome = "Mario"; 
     String cognome = "Rossi"; 
     Giocatore giocatore = new Giocatore(nome,cognome); 
     outToClient.writeObject(giocatore); 

// SERVER

ServerSocket ser = new ServerSocket(10000); 
    Socket sock = ser.accept(); 
    ObjectInputStream inFromClient = new ObjectInputStream(sock.getInputStream()); 
    ????? 
+0

可能重複的[在java中通過套接字發送對象](http://stackoverflow.com/questions/19217420/sending-an-object-through-a-socket-in-java) – plalx

+1

你不能沒有車就開車。沒有飛機,你不能坐飛機。如果沒有Person類,則無法讀取Person類的對象。 –

回答

0

由於服務器端沒有類人,所以它不能創建一個Person對象。

您可以將對象序列化爲XML或JSON文本並將其發送到服務器端,在服務器端 您可以反序列化要映射的XML或JSON(例如HashMap)。

對於JSON請嘗試Jackson a High-performance JSON processor

對於XML請檢查此計算器鏈接best-xml-parser-for-java

+0

服務器和客戶端在不同的項目..我可以序列化的對象? – user3608898

+0

p.s.在服務器上必須只有數據庫(它將插入db的對象Person) – user3608898

+0

使用Jackson,在客戶端可以將Java對象序列化爲JSON文本。例如{「name」:「Tom」,「age」12},在服務器端,您可以將JSON文本反序列化爲java映射。 – xfeep

0

要通過線路傳輸對象,兩端必須知道如何處理數據。一個會創建一個數據的表示併發送它,另一個端點必須知道會發生什麼以及如何解釋數據。

這就是我們所說的「協議」的基本概念。這是兩端達成的協議。

在Java中,我們曾經說過,您可以序列化一個對象,也就是說,粗略地說,如果該對象是一組屬性,則可以通過電線發送這些屬性,而另一側可以檢索這些屬性屬性,並知道對象結構,創建另一個並恢復其「狀態」。

注意,如果在兩端的類路徑中有相同的對象,那麼靜態最終常量(有時或某些人)無關緊要。有關序列化或非靜態屬性here的全部討論,所以要小心。

如果你想在兩側都使用同一個對象,它們的類路徑中必須有相同的Java類,所以將要恢復它的那一端可以知道每個屬性的放置位置。

請注意,某些數據類型不可序列化。例如,數據流基本上是一個讀取/寫入數據的處理程序,但是您不能奇蹟般地將其序列化並通過線路發送(或者理論上可以發送,但它可能無法正常工作,如果它是一個FileReader正在從僅在發送方可用的文件中讀取)。欲瞭解更多詳情,請參閱this

如果兩端具有相同的對象,並且它是可序列化的,則有一種方法是使用RMI將對象從一端傳送到另一端,example here。處理這種「數據傳輸」的其他協議是基於XML或基於JSON的協議。這些是基於文本的協議,它們很流行,易於處理,並且有幾個好的庫可用,並且可以處理大多數序列化需求。對於JSON,你有flexjson,gson和jackson。對於XML,您有Java本地支持,xerces2等。

如果您不關心在另一端有相同的對象(例如,您將讀取對象數據,但您不一定需要恢復另一個類似對象,或者您有興趣只能在一些特定的領域),你仍然可以使用這些基於文本的序列化格式,編寫你自己的解析器/閱讀器,並只提取你需要的數據。

+0

使用RMI,我必須實現一個接口遠程,但我必須在兩個不同的項目(和不同的工作區)中只有服務器和客戶端。那麼,我該怎麼辦? – user3608898

+0

你可能會發現這個教程有點有用http://code.nomad-labs.com/2010/03/26/an-improved-rmi-tutorial-with-eclipse/ – Leo

+0

我不能使用3個項目,因爲我必須在兩個不同的工作區中僅使用客戶端和服務器。所以,如果我在客戶端上放置一個遠程接口,服務器就無法看到這個接口,對吧? – user3608898

相關問題