繁体   English   中英

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

[英]Socket ObjectOutputStream writeUTF() and ObjectInputStream readUTF() not working

我正在尝试聊天,但我注意到readUTF()writeUTF()不起作用。 当我已经使用writeUTF()时, readUTF()会一直等待。 我做了一个简单的测试并不起作用,我做错了什么?

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

服务器代码:

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()转换字符串,但我想知道为什么这种方式不起作用。

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

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

ObjectOutputStream的 javadoc 包括:

调用者可能希望立即刷新 stream 以确保接收 ObjectInputStreams 的构造函数在读取 header 时不会阻塞

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM