gpt4 book ai didi

java - 检查 ObjectInputStream 上的数据是否可用

转载 作者:行者123 更新时间:2023-11-30 08:10:01 26 4
gpt4 key购买 nike

几周前,我发布了以下问题,因为我在使用 readObject 从 ObjectInputStream 读取对象时遇到问题:

Continuously read objects from an ObjectInputStream in Java

根据我得到的响应,我想我能够理解出了什么问题 -> 我正在循环中调用 readObject,即使没有发送数据,因此我收到 EOFException。

但是,因为我真的想要一种可以从输入流中持续读取的机制,所以我正在寻找解决此问题的方法。

我尝试使用以下方法创建一种机制,仅在有数据可用时调用 readObject:

if(mObjectIn.available() > 0)
mObjectIn.readObject()

但不幸的是,mObjectIn.available() 总是返回 0。

任何人都可以让我朝好的方向发展吗?是否有可能实现我想要的?

最佳答案

您可以通过ObjectOutputStream发送一个int,让对方知道您何时停止发送对象。

例如:

public static void main(String[] args) {
//SERVER
new Thread(new Runnable() {
@Override
public void run() {
try (ServerSocket ss = new ServerSocket(1234)) {
try (Socket s = ss.accept()) {
try (ObjectInputStream ois = new ObjectInputStream(
s.getInputStream())) {
while (ois.readInt() != -1) {//Read objects until the other side sends -1.
System.out.println(ois.readObject());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();

//CLIENT
try (Socket s = new Socket(InetAddress.getByName("localhost"), 1234)) {
try (ObjectOutputStream oos = new ObjectOutputStream(
s.getOutputStream())) {
for (int i = 0; i < 10; i++) {
oos.writeInt(1);//Specify that you are still sending objects.
oos.writeObject("Object" + i);
oos.flush();
}
oos.writeInt(-1);//Let the other side know that you've stopped sending object.
}
} catch (Exception e) {
e.printStackTrace();
}

}

或者您可以在末尾编写一个 null 对象,让对方知道您不会再发送任何对象。仅当您确定需要发送的对象都不为 null 时,此方法才有效。

new Thread(new Runnable() {
@Override
public void run() {
try (ServerSocket ss = new ServerSocket(1234)) {
try (Socket s = ss.accept()) {
try (ObjectInputStream ois = new ObjectInputStream(
s.getInputStream())) {
String obj;
while ((obj = (String) ois.readObject()) != null) {
System.out.println(obj);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();

try (Socket s = new Socket(InetAddress.getByName("localhost"), 1234)) {
try (ObjectOutputStream oos = new ObjectOutputStream(
s.getOutputStream())) {
for (int i = 0; i < 10; i++) {
oos.writeObject("Object" + i);
oos.flush();
}
oos.writeObject(null);
}
} catch (Exception e) {
e.printStackTrace();
}

关于java - 检查 ObjectInputStream 上的数据是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30510344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com