Java套接字块ObjectInputStream

时间:2018-12-06 09:18:47

标签: java serialization

在Java对象序列化中,您需要在服务器端和客户端中都在ObjectOutputStream之前创建ObjectInputStream,但是我要运行客户端,直到客户端等待为止从服务器获取数据(打印消息“ Done 1”,然后等待),在服务器端,代码仅运行直到到达从客户端读取第一件事为止(打印“ Done 1”,然后等待) 。 除了在ObjectOutputStream之前创建ObjectInputStream之外,我还需要做什么?在我看到的所有搜索中,他们都提到了对象创建的顺序,并且在一种情况下,他们说要在创建对象后立即刷新输出(例如Example1),但这也不起作用。

Example1

ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
dataOut.flush();
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());

服务器

@Override
public void run() {
    try {
        serverSocket = new ServerSocket(4554);
        serverRunning = true;
        while (serverRunning) {
            socket = serverSocket.accept();
            ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
            System.out.println("Done 1");

            String string = dataIn.readUTF();
            System.out.println("Done 2");

            int number = dataIn.readInt();
            System.out.println("Done 3");

            dataOut.writeUTF("String from server");
            System.out.println("Done 4");

            dataOut.writeInt(1);
            System.out.println("Done 5");

            System.out.println(string + " | " + number);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

客户

    Socket socket = new Socket("localhost", 4554);
    ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
    ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
    System.out.println("Done 1");

    dataOut.writeUTF("String from client");
    System.out.println("Done 2");

    dataOut.writeInt(2);
    System.out.println("Done 3");

    String string = dataIn.readUTF();
    System.out.println("Done 4");

    int number = dataIn.readInt();
    System.out.println("Done 5");

    socket.close();
    System.out.println(string + " | " + number);

//编辑: 因此,如果我将每个writeUTF() writeInt()更改为writeObject(),也要将每个readUTF() readInt()更改为readObject()(为{{ 1}}和String),在服务器端和客户端,问题都消失了。但是我不明白为什么会是这种情况,对此行为是否有解释以及解决方法?我会使用int,但是我也需要发送/获取对象,所以DataOuput/InputStream不会帮我。

0 个答案:

没有答案