2013-06-29 42 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

相关问题