2013-06-29 77 views
0

對於我正在使用的Java類,我需要使用套接字在客戶端和服務器之間來回傳遞數據。雖然我可以獲得傳遞字符串數據的示例,但我需要能夠傳遞自定義類對象(即產品)和這些對象的列表來回傳遞。我無法讓服務器部分成功讀取輸入。我試圖創建一個簡單的代碼示例,以查看是否有人可以查明問題。我明白,我沒有完整的代碼,但我甚至無法讓服務器讀取類正在寫入流的對象(在這種情況下,我正在寫一個字符串以試圖獲取它工作,但需要讀/寫對象)。這是我的代碼。我花了數小時的時間試圖研究其他人的問題並作出回答,但仍然無法使其發揮作用。使用ObjectInputStream實現套接字 - 無法讀取對象

在這裏,示例代碼:

簡單的服務器:

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class simpleServer { 

    public static final int PORT_NO = 8888; 
    static ObjectInputStream serverReader = null; 


    public static void main(String[] args) throws IOException, InterruptedException { 

     ServerSocket serverSocket = new ServerSocket(PORT_NO); 
     System.out.println("... server is accepting request"); 
     Object myObject = null; 
     while (true) { 
      Socket socket = serverSocket.accept(); 
      System.out.println("creating reader"); 
      ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
      serverReader = new ObjectInputStream(socket.getInputStream()); 
      System.out.println("created reader"); 
      try { 
       System.out.println("try to read"); 
       myObject = serverReader.readObject(); 
       System.out.println("read it"); 
       System.out.println(myObject); 
       if (myObject != null) objOut.writeUTF("Got something"); 
       else objOut.writeUTF("got nothing"); 
       if ("quit".equals(myObject.toString())) serverSocket.close(); 
      } catch (ClassNotFoundException e1) { 
       // TODO Auto-generated catch block 
       System.out.println("cath for readobject"); 
      } 
      catch (Exception e) { 

       System.out.println("other error"); 
       System.out.println(e.getMessage()); 
      } 
     } 

    } 
} 

簡單的客戶端:

public static void main(String[] args) { 
    Socket socket; 
    try { 
     socket = new Socket("localhost", ProductDBServer.PORT_NO); 
     ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
     ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 

     objOut.writeUTF("loadProductsFromDisk"); 
     objOut.flush(); 
     String myString = objIn.toString(); 
     //System.out.println(myString); 
     if (!"quit".equals(objIn.toString().trim())) { 
      //System.out.println("reading line 1"); 
      String line; 
      try { 
       line = (String)objIn.readObject(); 
       //System.out.println("line is " + line); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      objIn.close(); 
      //System.out.println("result: " + line); 
     } 

     System.out.println("closing socket"); 
     socket.close(); 

    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     System.out.println("Unknownhostexception"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     System.out.println("ioexception"); 
     e.printStackTrace(); 
    } 


} 

的代碼出現運行到在服務器側,其中它改掉讀取點我發送的對象,然後死亡。有人可以看到我做錯了什麼嗎?這似乎是一件很簡單的事情,但我似乎無法讓它工作。謝謝你的幫助!

+0

首先我想知道爲什麼你只需要發送String就可以在服務器和客戶端之間進行通信的ObjectStream!其次,當你發送UTF時,你需要讀取UTF,沒有Object,只需改變「myObject = serverReader.readObject();」在服務器中用「myObject = serverReader.readUTF();」 – 2013-06-29 15:58:12

+0

就是這樣。謝謝。我發送的字符串部分只是爲了證明概念,但也因爲我將不得不發送字符串和對象。 – Sheila

+0

所以這是我第一次發佈一個問題。我想表明你回答了我的問題,但我無法像StackOverflow幫助說的那樣找到該選項。這可能是你評論而不是回答 - 我不確定,但我想表明你確實回答了我的問題。謝謝! – Sheila

回答

0

要將對象寫入ObjectOutputStream,需要調用writeObject()。

不是writeUTF()。

要從ObjectInputStream中讀取對象,您需要調用readObject()。

不是toString()。

+0

謝謝。上面的User2511414讓我知道如果我做了writeUTF,我需要讀取utF(而不是readObject)。我需要能夠寫入字符串和對象,所以我開始使用字符串,並且無法使其工作。我感謝您的意見! – Sheila

相關問題