2

クライアントが多数のデータセットをサーバーに送信しているTCP経由のサーバークライアントセットアップがあります。読み書きは ObjectInput/OutputStream を使用します。通常は問題ないのですが、データフローが重くなると StreamCorruptedException: invalid type code が出てしまいます。無効なコードは毎回異なります。ソケットを 1 回開き、同期メソッドを呼び出して、複数のスレッドからデータを送信します。

クライアント:

socket = new Socket("localhost", sockNum);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());

public synchronized void sendMsg(Message msg){
    try{
        out.writeObject(security.signObject(msg, privKey));
        out.reset();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

サーバ:

ServerSocket server = new ServerSocket(sockNum);
Socket client = server.accept();
ObjectInputStream in = new ObjectInputStream(client.getInputStream());

while(threadActive){
    Object line = in.readObject();
    handleObject(line);
}

更新: 各送信後に out.reset() を追加しましたが、問題は解決しませんでした。また、ループにスリープ ステートメントを追加して、データ レートを下げました。これによりエラーは解消されますが、実際の解決策ではありません。

編集:最初にこれを尋ねてから少し時間が経ちましたが、再び問題に直面しています。メッセージを送信するたびに、スレッドが「確認」メッセージを待機するようにシステムをセットアップしようとしました。受信プロセスに StreamCorruptedException がある場合、ack ではなく「再送信」が返されます。これは、解決策よりも多くの問題を引き起こしているようです。他のアイデアはありますか?

4

1 に答える 1

2

マルチスレッドの方法で出力ストリームに書き込んでいるように聞こえます。つまり、例以外の場所に書き込んでいます。

ところで: メモリ リークを防ぐために定期的にストリームを reset() していますか?

于 2012-08-09T18:33:50.847 に答える