如何从客户端向服务器发送对象?

时间:2014-05-10 12:58:24

标签: java

我必须从客户端向服务器发送类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());
    ?????

2 个答案:

答案 0 :(得分:0)

因为服务器端没有类Person,所以它不能创建Person的对象。

您可以将对象序列化为XML或JSON文本,并将其发送到服务器端的服务器 您可以反序列化要映射的XML或JSON(例如HashMap)。

对于JSON,请尝试Jackson a High-performance JSON processor

对于XML,请检查此stackoverflow链接best-xml-parser-for-java

答案 1 :(得分:0)

要通过线路传输对象,两端必须知道如何处理数据。一个人将创建数据的表示并发送它,另一端必须知道期望什么以及如何解释数据。

这就是我们称之为"协议"的基本概念。这是两端的协议。

在Java中,我们曾经说过你可以序列化一个对象,粗略地说,这意味着如果该对象是一组属性,你可以通过网络发送这些属性,另一方可以检索这些属性并且,了解对象结构,创建另一个并恢复其状态"。

请注意,如果两端类路径中都有相同的对象,那么静态最终常量并不重要(有时或某些人)。有关序列化或非静态属性here的整个讨论,请小心。

如果你想在两边都有相同的对象,那么它们的类路径中必须有相同的Java类,所以恢复它的那一端可以知道每个属性的放置位置。

请注意,某些数据类型不可序列化。例如,数据流基本上是一个读取/写入数据的处理程序,但是你不能神奇地将其序列化并通过网络发送(或者你理论上可以发送,但它可能无法工作,如果它&# 39; sa FileReader,它从只在发送方可用的文件中读取)。有关详细信息,请参阅this

如果两端都有相同的对象,并且它是可序列化的,那么一种方法是使用RMI将对象从一端传输到另一端example here。其他协议将处理这个"数据传输"是基于XML或基于JSON的协议。这些是基于文本的协议,它们很流行,易于处理,并且有几个很好的库,可以处理大多数序列化需求。对于JSON,你有flexjson,gson和jackson。对于XML,您具有Java本机支持,xerces2等。

如果您不在乎另一端有相同的对象(例如,您要阅读对象数据,但您不一定需要恢复其他类似对象,或者您只对某些特定领域感兴趣),您仍然可以使用这些基于文本的序列化格式并编写自己的解析器/阅读器,并仅提取您需要的数据。