2011-12-02 44 views
1

我想通过物理网络(不通过本地主机)在java中发送对象,但似乎我有什么问题。通过使用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并且我没有使用接口时,一切正常,因为我的所有类都在一个目录中,所以客户端“知道”了对象。现在我希望它能够在物理网络上工作,因此客户端只具有与对象的接口。看起来客户端无法接收对象,因为每次抛出异常。

+0

注意:Java类和接口的名称应该以大写字母开头。此外,您的代码中充满了错误,这意味着您还没有真正使用它:修复它,再次尝试并在错误中添加更多详细信息。 – Viruzzo

+1

如果你不知道铅笔是什么,如果你知道铅笔是一种书写工具,那并不重要。发送只知道接口的对象不起作用,因为您仍然需要知道对象是什么。接口不是类定义的替代品。 – Toomai

回答

2

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

通常,一个用于创建这样的传统的客户端 - 服务器例如三个包/项目:

普通:用于由客户端和服务器代码;您想从服务器向客户端发送的对象的类定义属于这里

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

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

2

它应该是这样的。你可以用一个你没有的代码做什么?

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

+0

这就是我的情况,阅读这篇文章http://java.sun。com/developer/technicalArticles/ALT/sockets /我相信我正朝着正确的方向前进,“使用这种技术,你只需要提供接口的副本到客户端和服务器,但不是实现”但知道我会寻找一种不同的方法。 –

2

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

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

2

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

Jini(aka Apache River)使这很容易。

+0

我的目标是开发一个分布式框架,其中客户端可以接收一个类并使用它来进行一些计算。因为这纯粹是一种学习练习,所以我想自己开发一下。 –