2013-10-30 23 views
0

好的,我正在開發一個程序,用於保存向量中多個文件的名稱和路徑,並將這些文件從服務器發送到客戶端。所以我只是試圖用一個文件的單個條目發送一個單一的矢量,但無濟於事。客戶端代碼中的向量初始化似乎有點奇怪,使用ObjectInput和ObjectOutput接口發送向量是不正確的?或者我只是做錯了嗎? Server代碼:通過TCP發送矢量 - 是使用ObjectOutput完成的嗎?

import java.io.*; 
import java.net.*; 
import java.util.*; 
    class TCPServer 
    { 
    public static void main(String argv[]) throws Exception 
     { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6789); 
     Vector<String> name = new Vector<String>(3, 1); 
     File f0=new File("C:/Downloads","hjd"); 
     name.addElement(f0.getName()); 


     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      if(clientSentence!="hjd") 
      outToClient.writeBytes("Please enter correct directory/filename"); 
      else{ 
      OutputStream socketStream = connectionSocket.getOutputStream();//output stream where the object is to be written 
      ObjectOutput objectOutput = new ObjectOutputStream(socketStream); 
      objectOutput.writeObject(name);//no error during compilation of this line however 



    } 
    } 
} 

而這給了我發現誤差向量中的聲明行不兼容類型的客戶端代碼:

import java.io.*; 
import java.net.*; 
import java.util.*; 


class TCPClient 
{ 
public static void main(String argv[]) throws Exception 
{ 
    String sentence; 
    System.out.println("Enter name of file as hjd");//I will later expand this to add more options 
    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
    sentence = inFromUser.readLine(); 
    outToServer.writeBytes(sentence + '\n'); 
    InputStream socketStream = clientSocket.getInputStream(); 
    ObjectInputStream objectInput = new ObjectInputStream(socketStream); 
    Vector<String> name = objectInput.readObject();//This is the line I am recieving an error on,saying "incompatible types found" 
    System.out.println("The name of file is:"+name.get(0)); 
    clientSocket.close(); 
} 
} 

彙總,我可以給使用這些接口的載體?如果不是,那麼我如何通過TCP發送一個向量?如果是的話,錯誤線路的正確聲明是什麼,因爲這個線路甚至沒有提到的矢量的大小或增量?

編輯 - 現在感謝ALex,錯誤消失了。我已編輯的聲明像這樣:

if(objectInput.readObject() instanceof String){ 
    String a=(String)objectInput.readObject(); 
    System.out.println("The name of file is:"+a); 
}else if(objectInput.readObject() instanceof Vector){ 
    Vector<String> name=(Vector<String>)objectInput.readObject(); 
    System.out.println("The name of file is:"+name.get(0)); } 

,但會產生話說例外的程序運行,而我的ObjectInputStream已損壞。我錯過了什麼?

+0

您的代碼看起來不錯。您是否在客戶端和服務器上運行不同版本的Java? – Alex

+0

@Alex Nope,實際上在同一個系統上運行它們,所以我不認爲這是可能的。那麼你能告訴我如何在客戶端代碼中聲明Vector名稱的大小和大小嗎? – rednblue

+0

如果您收到異常,則應編輯問題以包含完整的堆棧跟蹤。 – Alex

回答

0

你的問題是這樣的一行:

Vector<String> name = objectInput.readObject(); 

的問題是,ObjectInputStream.readObject()方法被定義爲返回一個Object,所以你不能將它的返回值賦給聲明Vector類型的變量。爲了使這項工作,你需要明確將返回值:

Vector<String> name = (Vector<String>)objectInput.readObject(); 

這將讓你過去的編譯錯誤,但由於服務器代碼寫入無論是StringVector你有進一步的問題。所以在客戶端,您必須檢查從流中讀取的對象的類型(使用instanceof),然後將其轉換爲適當的類型。

+0

謝謝,這是有道理的。但是,如何分配此矢量的默認長度和incr? – rednblue

+0

你不能。當使用ObjectInputStream時,反序列化對象的內部字段將根據從流中讀取的值進行設置,因此它們將與服務器端寫入的值相同。如果你想改變這些,你將不得不創建一個新的Vector,並將反序列化矢量的內容複製到它中。 – Alex

+0

好吧,所以現在我已經編輯該行,如下所示: if(objectInput.readObject()instanceof String){ String a =(String)objectInput.readObject(); System.out。println(「文件名稱:」+ a); } else if(objectInput.readObject()instanceof Vector){ Vector name =(Vector )objectInput.readObject(); System.out.println(「文件的名稱是:」+ name.get(0)); } 錯誤消失了!但是,在運行程序時,會產生一個異常,說我的ObjectInputStream已損壞。如果不是太麻煩,你能告訴我我做錯了什麼嗎? – rednblue