java套接字块objectinputstream

92vpleto  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(217)

在java对象序列化中,需要创建 ObjectOutputStream 之前 ObjectInputStream 在服务器端和客户机端,我都这么做了,但是客户机将一直运行,直到它必须等待来自服务器的数据(打印消息“done 3”,然后等待),而在服务器端,代码只运行,直到它从客户机读取第一件事(打印“done 1”,然后等待)。除了创建 ObjectOutputStream 之前 ObjectInputStream ? 从我看到的所有搜索中,他们都提到了对象创建的顺序,在一个例子中,他们说在创建输出后立即刷新输出(如示例1),但这也不起作用。
例1

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() (为添加相应的强制转换) String 以及 int )在服务器端和客户端,问题消失了。但我不明白为什么会出现这种情况,有没有对这种行为的解释和解决办法?我会用 DataOuput/InputStream ,但我也需要发送/获取对象,所以 DataOuput/InputStream 不会帮我的。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题