gpt4 book ai didi

java - 每次都必须重新创建 ObjectOutputStream

转载 作者:行者123 更新时间:2023-11-29 05:57:28 26 4
gpt4 key购买 nike

我见过一些人问过类似的问题,但任何人发布的唯一答案是你不应该这样做。

但我已经对这两种方式进行了测试 - 它只适用于这种方式。

服务器端

    try {
// Obtain input and output streams to the client
while(true) {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Object input = in.readObject();
if(input == RequestEnums.GETCURRENTGRID) {
out.writeObject(ContagionServerData.getImagePixels());
out.writeObject(ContagionServerData.getImageHeight());
out.writeObject(ContagionServerData.getImageWidth());
}
}
} catch( Exception e ) {
e.printStackTrace();
}

客户端

    try {
inputStream = new ObjectInputStream(serverSocket.getInputStream());
outputStream = new ObjectOutputStream(serverSocket.getOutputStream());
outputStream.writeObject(RequestEnums.GETCURRENTGRID);
int[] imagePixels = (int[]) inputStream.readObject();
int imageHeight = (Integer) inputStream.readObject();
int imageWidth = (Integer) inputStream.readObject();
copyImage(background, imagePixels, imageHeight, imageWidth);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

这整天都有效。

但是如果我把它改成这样——

    try {
// Obtain input and output streams to the client
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

while(true) {
Object input = in.readObject();
if(input == RequestEnums.GETCURRENTGRID) {
out.writeObject(ContagionServerData.getImagePixels());
out.writeObject(ContagionServerData.getImageHeight());
out.writeObject(ContagionServerData.getImageWidth());
out.flush();
}
}
} catch( Exception e ) {
e.printStackTrace();
}

(我在代码的更上方创建了输入和输出流)

    try {
outputStream.writeObject(RequestEnums.GETCURRENTGRID);
outputStream.flush();
int[] imagePixels = (int[]) inputStream.readObject();
int imageHeight = (Integer) inputStream.readObject();
int imageWidth = (Integer) inputStream.readObject();
copyImage(background, imagePixels, imageHeight, imageWidth);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

然后我第一次从服务器成功接收到正确的数据 - 但此后每次 - 我只收到相同的数据而不是更新的数据,并且没有关于原因的错误。

最佳答案

当您在对象流上发送数据时,它只会发送每个对象一次。这意味着如果您多次修改对象并发送它,则需要使用 writeUnshared(mutableObject)reset() 来清除已发送对象的缓存。


您不能重复创建 ObjectOutput/InputStream。如果要确保发送数据而不是缓冲数据,请使用 flush()。如果您发送的数据不是对象,而是 int,请尝试 DataOutput/InputStream。

关于java - 每次都必须重新创建 ObjectOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11510005/

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