我见过一些人提出类似的问题,但有人发帖的唯一答案就是你不应该这样做。
但是我已经对它进行了两种方式的测试 - 它只能这样运作。
服务器端
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();
}
然后我第一次从服务器成功接收到正确的数据 - 但每次之后 - 我只是收到相同的数据,而不是更新的数据,没有错误原因。
答案 0 :(得分:3)
当您在对象流上发送数据时,它只会发送一次每个对象。这意味着如果您多次修改和对象并发送它,则需要使用writeUnshared(mutableObject)
或reset()
清除已发送对象的缓存。
您无法重复创建ObjectOutput / InputStream。如果要确保发送数据而不是缓冲使用flush()
。如果要发送int
而不是对象等数据,请尝试使用DataOutput / InputStream。
答案 1 :(得分:0)
查看ObjectOutputStream.reset()
和ObjectOutputStream.writeUnshared().