2014-05-10 35 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

相关问题