簡體   English   中英

如何從客戶端向服務器發送對象?

[英]How send an object to server from client?

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

//客戶

      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);

//服務器

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

因為服務器端沒有Person類,所以它不能創建Person對象。

您可以將對象序列化為XML或JSON文本,然后將其發送到服務器,在服務器端,您可以反序列化XML或JSON以進行映射(例如HashMap)。

對於JSON,請嘗試使用Jackson高性能JSON處理器

對於XML,請檢查此stackoverflow鏈接best-xml-parser-for-java

為了通過電線傳輸對象,兩端必須知道如何處理數據。 一個將創建數據的表示形式並將其發送,另一端必須知道期望什么以及如何解釋數據。

這就是我們所謂的“協議”的最基本概念。 這是雙方的協議。

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

請注意,如果兩端類路徑中的對象相同,則靜態最終常量(有時或對某些人而言)並不重要。 有一個關於序列化或不是靜態屬性的整個討論在這里 ,所以要小心。

如果雙方都希望使用相同的對象,則它們的類路徑中都必須具有相同的Java類,因此將其還原的末尾可以知道將每個屬性放在何處。

請注意,某些數據類型不可序列化。 例如,數據流本質上是一個讀取/寫入數據的處理程序,但是您無法神奇地對其進行串行化並通過有線發送(或者理論上可以發送,但是如果它是FileReader則無法工作)正在從僅在發送方可用的文件中讀取)。 有關此的更多詳細信息,請參閱

如果兩端都有相同的對象,並且可以序列化,則一種方法是使用RMI將對象從一端轉移到另一端, 例如此處 將處理此“數據傳輸”的其他協議是基於XML或基於JSON的協議。 這些是基於文本的協議,很流行,易於處理,並且有幾個不錯的庫可供使用,並且可以處理大多數序列化需求。 對於JSON,您可以使用flexjson,gson和jackson。 對於XML,您具有Java本機支持,xerces2等。

如果您不希望在另一端擁有相同的對象(例如,您將要讀取對象數據,但不必還原另一個類似的對象,或者您只對某些特定對象感興趣)字段),您仍然可以使用這些基於文本的序列化格式,並編寫自己的解析器/閱讀器,也僅提取所需的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM