繁体   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