使用Java在网络上发送对象

时间:2011-12-02 13:41:51

标签: java network-programming

我试图通过物理网络(不是通过localhost)在java中发送一个对象,但似乎我有些不对劲。

对象的接口(客户端和服务器具有此接口):

public interface distributable extends Serializable {

      public void test();
}

我想发送的对象(只有服务器有这个):

class ObjectToSend implements distributable {

       public ObjectToSend() {
       }

       public void test() {
            system.out.println("worked!");
       } 
}

服务器:

private ObjectToSend obj = new ObjectToSend();

obj_out_stream.writeObject(obj);
obj_out_stream.flush();

客户端:

private distributable ReceivedObj = null;

try {
       ReceivedObj = (distributable) obj_in_steam,readObject();
} catch (ClassNotFoundException e) {
       System.err.println("Error<w_console>: Couldn't recieve application code!");
} 
ReceivedObj.test();

ObjectToSend类实现了Serializable并且我没有使用接口时,一切正常,因为我的所有类都在一个目录中,因此客户端“知道”了该对象。现在我希望它在物理网络中工作,因此客户端只有对象的接口。似乎客户端无法接收对象,因为每次抛出异常。

4 个答案:

答案 0 :(得分:2)

应该是这样的。对于那些你没有代码的班级,你能做些什么?

看看这里:stackoverflow.com/questions/8175052/java-polymorphism-my-teacher-claims-you-can-distribute-an-executable-object-thr

答案 1 :(得分:2)

为了能够使用objectinput / outputstream序列化和反序列化对象,类必须实现Serializable。

此外,反序列化器必须能够在类路径中找到您尝试反序列化的类,因为它嵌入在序列化表单中。

答案 2 :(得分:2)

如果您希望客户端只有接口 - 在编译时 - 那么您需要在运行时从服务器下载实际的类。

Jini(又名Apache River)让这很容易。

答案 3 :(得分:2)

正如其他答案所示,客户端还必须知道要发送的对象的类。

通常,为这样一个经典的客户端 - 服务器示例创建三个包/项目:

Common:客户端和服务器使用的代码;要从服务器发送到客户端的对象的类定义属于

客户:只有客户需要了解的所有代码

服务器:只有服务器需要了解的所有代码