套接字 ObjectOutputStream writeUTF() 和 ObjectInputStream readUTF() 不工作

Socket ObjectOutputStream writeUTF() and ObjectInputStream readUTF() not working

我正试图进行聊天,但我注意到 readUTF()writeUTF() 不起作用。 readUTF() 在我已经使用了 writeUTF() 时仍在等待。我做了一个简单的测试,没有用,我做错了什么?

(我知道我可以使用数据流而不是对象流,但在我的聊天中我想写对象和字符串)

服务器代码:

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

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(40001);

        Socket s = server.accept();
        ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(s.getInputStream());

        System.out.println(in.readUTF());
        out.writeUTF("E");
    }
}

客户代码:

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

public class Client {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("localhost", 40001);
        ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(s.getInputStream());

        out.writeUTF("A");
        System.out.println(in.readUTF());
    }
}

我可以使用 writeObject("A") 并使用 readObject() 转换字符串,但我想知道为什么这种方式不起作用。

ObjectOutputStream 使用内部缓冲区,因此如果您希望内容可在 InputStream 上读取,您应该在写入后尝试 out.flush()

ObjectOutputStream 的 javadoc 包括:

callers may wish to flush the stream immediately to ensure that constructors for receiving ObjectInputStreams will not block when reading the header

使用writeUTF写入后需要调用flush()writeObject 似乎有效的原因是 writeObject 会在开始写入之前切换到特定模式,并在完成后切换回来。这种切换回来将自动刷新缓冲数据(至少在 Java 11)。 writeUTF 不是这种情况,需要显式调用 flush()