![](/img/trans.png)
[英]Socket ObjectInputStream and ObjectOutputStream not working
[英]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.