1

何人かが同様の質問をするのを見たことがありますが、これまで投稿した唯一の答えは、あなたはそれをする必要はないということです.

しかし、私は両方の方法でテストしましたが、この方法でしか機能しません。

サーバ側

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

次に、サーバーから初めて正しいデータを正常に受信しましたが、その後は毎回、更新されたデータではなく同じデータを受信し、理由に関するエラーはありません。

4

2 に答える 2

3

オブジェクト ストリームでデータを送信すると、各オブジェクトは 1 回だけ送信されます。これは、オブジェクトを変更して何度も送信する場合は、既に送信されたオブジェクトのキャッシュを使用するか、どちらwriteUnshared(mutableObject)かをクリアする必要があることを意味します。reset()


ObjectOutput/InputStream を繰り返し作成することはできません。バッファリングの代わりにデータが確実に送信されるようにしたい場合は、 を使用しますflush()。オブジェクトの代わりにデータを送信する場合はint、DataOutput/InputStream を試してください。

于 2012-07-16T18:14:10.020 に答える
0

ObjectOutputStream.reset()との Javadoc を参照してください。ObjectOutputStream.writeUnshared().

于 2012-07-17T02:30:57.233 に答える