2011-12-02 45 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

我的目標是開發一個分佈式框架,其中客戶端可以接收一個類並使用它來進行一些計算。因爲這純粹是一種學習練習,所以我想自己開發一下。 –