套接字 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()
。
我正试图进行聊天,但我注意到 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()
。