1

ソケットInputStream変数をスレッドに渡してオブジェクトを書き込もうとするとエラーが発生します。クライアントと 2 つのスレッドがあります。最初にテキスト入力を読み取り、2 番目にシリアル化されたオブジェクトを読み取ります。それらは同時に実行されるため、volatile static InputStream socketIs;を設定します。そうですか?修正方法は?

java.io.StreamCorruptedException: invalid stream header: 57656C63
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at com.client.ClientThreadInObj.<init>(ClientThreadInObj.java:25)
    at com.client.Client.main(Client.java:77)

    public class Client { 
        static ClientThreadIn threadIn;
        static ClientThreadInObj threadInObj;
        volatile static InputStream socketIs; 
        volatile static PrintStream ps;
        volatile static BufferedReader in; 
        static PrintWriter out;
        static Socket s;

    public static void main(String[] args){
             in = null; 
             out = null; 
             socketIs =null;
             threadIn = null;
             threadInObj = null;
             try{ 
                socketIs = s.getInputStream();
                in = new BufferedReader(new InputStreamReader(socketIs)); 
                out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
                JPanelOne gui= startGUI();
                gui.setOutputPrintWriter(out);
                OutputStream outStream = gui.getRefToOutputStream(); 
                ps =  new PrintStream(outStream); 

                threadIn = new ClientThreadIn(in, ps, gui);
                threadInObj = new ClientThreadInObj(socketIs, ps, gui); // ERROR

                threadIn.start();
                threadInObj.start();
            catch(IOException ioe) 
        { ..}
...
    }

サーバ:

...
Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        try {
                            FlattenLot fL = new FlattenLot(clientThread.m_clientSocket.getOutputStream(), currentLot);
                            fL.sendObj();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }, 100);
...

to out.writeObject(lot); パッケージシリアルの試行中にデバッグがサーバー側でエラーを表示します。

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;

import com.server.Lot;

public class FlattenLot {

    OutputStream oStream;
    Lot lot;

    public FlattenLot(OutputStream os, Lot l){
        lot = l;
        oStream = os;
    }

    public void sendObj(){
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(oStream);
            out.writeObject(lot); // ERROR: java.io.NotSerializableException
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

多く:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import java.util.Date;
import java.util.Calendar;

public class Lot implements Serializable{
    private static final long serialVersionUID = 1L;
    private  String NAME;
    public synchronized String getName(){return NAME;}
}

多くの実装しSerializableます。なぜ投げられたのjava.io.NotSerializableExceptionですか?データを取得するために BufferReader(Input stream) を使用した最初のスレッドから Lot オブジェクトを正常に取得しました。2 番目のスレッドがオブジェクトを読み取れないのは、おそらく最初のスレッドで赤くなったためです。InputStream is = socket.getInputStream()変数が揮発性として定義されており、スレッドセーフなコラボレーションを保証する必要が あるという事実にもかかわらず、2 つのスレッドがソケット入力ストリームを求めて競合しているようです....

4

1 に答える 1

1

ソケットの存続期間中、単一の ObjectInputStream と ObjectOutputStream を使用します。

于 2012-06-06T02:59:50.917 に答える