0

複数のクライアントと1つのサーバーがあります。サーバーは、各クライアントを1つのスレッドで処理します。クライアントは、custonオブジェクトをマスターに送信する必要があります。私はこれこれをチェックしました、java.io.StreamCorruptedException: invalid type code: ACそれはまさに私が持っているエラーについて話します。

しかし、私は提案された解決策を理解していませんでした。彼はObjectOutputStreamを継承し、simpleは2回目以降にヘッダーを書き込まず、オブジェクトを送信する必要があります。これは私にはうまくいきません。

TCPソケットを介してカスタムオブジェクトを送信する別の解決策はありますか?クライアントは10秒ごとにデータを収集し、送信されるオブジェクトを再作成します。

繰り返しの場合は申し訳ありませんが、似たような質問をたくさん読んでいますが、シナリオに対する答えが見つかりません。

前もって感謝します

編集

送信メソッド(クライアント内)

    public void TCPEchoClientSend(MonitoredData _mData) throws IOException {
        if (_mData == null)
            throw new IllegalArgumentException("Parameter: <Monitored Data> empty.");           
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        // Send the encoded object to the server
        oos.writeObject(_mData);

        oos.close();

        System.out.println("Client sent the monitored data package.");

    }

受け取る

public static void handleEchoClient(Socket client, Logger logger) {
        try {
            MonitoredData mdata;
            // Get the input and output I/O streams from socket
            ObjectInputStream ois = new ObjectInputStream(client
                    .getInputStream());
            ObjectOutputStream oos = new ObjectOutputStream(client
                    .getOutputStream());

            // Receive until client closes connection, indicated by -1;
            while ((mdata = (MonitoredData) ois.readObject()) != null) {

                System.out.println("Got received data. Ready to save.");

                hdb.saveOrUpdate(mdata);

                System.out.println("Monitored Data arrived at home.");

            }

            // logger.info("Client " + _clntSock.getRemoteSocketAddress()+
            // ", echoed " + totalBytesEchoed + " bytes.");

        } catch (IOException ex) {
            logger.log(Level.WARNING, "Exception in echo protocol", ex);
        } catch (ClassNotFoundException e) {
            logger.log(Level.WARNING, "Exception in echo protocol", e);
        } finally {
            try {
                client.close();
            } catch (IOException e) {
            }
        }
    }
4

2 に答える 2

2

ソケットの存続期間中、両端で同じものObjectOutputStreamを使用し、およびwriteUnshared()メソッドを検索します。ObjectInputStreamObjectOutputStream reset()

議論については、この回答を参照してください。

于 2012-07-18T22:29:06.917 に答える
-1

ObjectInputStreamとObjectOutputStreamはステートフルです。したがって、それらのライフサイクルを一致させる必要があります。オブジェクトのWebを送信するたびに(つまり、10秒ごとに)、各クライアントで新しい出力ストリームをインスタンス化しますか?そのため、サーバーで対応する入力ストリームをインスタンス化するのが最善です。これは最も安全でクリーンなオプションですが、より多くのデータをネットワーク経由で送信することに注意してください。

一方、ストリームを維持している場合は、いくつかのことを心配する必要があります。まず、不変のオブジェクトのみを送信していますか?そうしないと、目的のコンテンツを伝達できない可能性があります(シリアル化により、各オブジェクトが1回だけ書き込まれ、その後、以前にシリアル化されたオブジェクトへの参照が書き込まれます)。

于 2012-07-18T20:06:23.693 に答える