【问题标题】:Socket implementation with ObjectInputStream - can't read object使用 ObjectInputStream 实现套接字 - 无法读取对象
【发布时间】:2013-06-27 05:36:09
【问题描述】:

对于我正在学习的 Java 类,我需要使用套接字在客户端和服务器之间来回传递数据。虽然我可以获得传递字符串数据的示例,但我需要能够来回传递自定义类对象(即产品)和这些对象的列表。我无法让服务器成功读取输入。我尝试为我的代码创建一个简单的示例,看看是否有人可以查明问题所在。我知道我没有完整的代码,但我什至无法让服务器读取该类正在写入流的对象(在这种情况下,我正在编写一个字符串只是为了尝试让它工作,但需要读/写对象)。这是我的代码。我已经花了好几个小时尝试这个并研究其他人的问题和答案,但仍然无法让它发挥作用。

这里是示例代码:

简单的服务器:

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();
    } 


}

代码似乎运行到服务器端尝试读取我发送的对象的位置,然后死掉。有人可以看到我做错了什么吗?这似乎是一件很简单的事情,但我似乎无法让它发挥作用。感谢您的帮助!

【问题讨论】:

  • 首先我想知道为什么当你只是发送String时,你为什么要用ObjectStream在服务器和客户端之间进行通信!二、发送UTF时,需要读取UTF,没有Object,只要改“myObject = serverReader.readObject();”在服务器中使用“myObject = serverReader.readUTF();”
  • 就是这样。谢谢你。我发送一个字符串部分只是为了证明概念,但也因为我必须同时发送字符串和对象。
  • 所以这是我第一次发布问题。我想表明你回答了我的问题,但我找不到 StackOverflow 帮助说我应该有的选项。可能是您发表了评论而不是回答 - 我不确定,但我想表明您确实回答了我的问题。谢谢!
  • 不需要哥们,我很高兴能帮上忙,评论、回答、抽烟、.. . ., 谢谢 :D, 有很好的应用程序
  • 顺便说一句,为什么不为每个到达服务器的请求运行一个单独的线程,当前的方法是单线程方式,如果两个客户端尝试连接,第二个客户端必须等待直到第一个完成

标签: sockets objectinputstream objectoutputstream


【解决方案1】:

要将对象写入 ObjectOutputStream,您需要调用 writeObject()。

不写UTF()。

要从 ObjectInputStream 中读取对象,您需要调用 readObject()。

不是 toString()。

【讨论】:

  • 谢谢。上面的 User2511414 让我知道,如果我执行 writeUTF,我需要 readUTF(而不是 readObject)。我需要能够编写字符串和对象,所以我从字符串开始,但无法让它工作。感谢您的意见!
【解决方案2】:

在您的代码中查看:

// Simple Client 
objOut.writeUTF("loadProductsFromDisk");           // Line 8

您正在向服务器端发送 UTF-8 格式的字符串 "loadProductsFromDisk"。 所以为了在服务器端接收和读取它,你需要这样的东西:

String clientReq = serverReader.readUTF();  

其中,serverReader 是您的 ObjectInputStream 对象。

否则,如果您希望发送和接收对象,您必须使用 writeObject() & readObject() 方法。

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 2018-05-20
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多