每次都必须重新创建ObjectOutputStream

时间:2012-07-16 18:09:08

标签: java objectoutputstream objectinputstream

我见过一些人提出类似的问题,但有人发帖的唯一答案就是你不应该这样做。

但是我已经对它进行了两种方式的测试 - 它只能这样运作。

服务器端

    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();
    }

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

2 个答案:

答案 0 :(得分:3)

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


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

答案 1 :(得分:0)

查看ObjectOutputStream.reset()ObjectOutputStream.writeUnshared().

的Javadoc