3

デバッガーの実行中、プログラムはサーバーのメイン入出力ストリームからのオブジェクトストリームの初期化を一時停止します。以下はコードです:

 public TFileReader(Client cli)throws Exception{
    this.cli = cli;
    fileSock = new Socket(cli.ServerIp(), cli.FilePort());
    fobjIn = new ObjectInputStream(fileSock.getInputStream());
    fobjOut = new ObjectOutputStream(fileSock.getOutputStream());
    fobjOut.flush();

}

 @Override
public void run(){

    try{
            System.out.println("file reader thread online");

            fobjOut.writeObject(cli.Name());
            fobjOut.flush();
           String per = (String) fobjIn.readObject();
            System.out.println(per+"video filing...");
            if(!per.equals("OKF"))
            {
                    throw new Exception("Error In retriving video.");
            }

一時停止し、ブレークポイントを通過してもfobjIn実行に進みませんが、ブレークポイントをヒットしません。fobjOutfobjInfobjIn

4

2 に答える 2

5

私はそれをこのように単純に保ちます

public TFileReader(Client cli) throws IOException {
    this.cli = cli;
    socket = new Socket(cli.ServerIp(), cli.FilePort());
    out = new ObjectOutputStream(socket.getOutputStream());
    out.flush();
    in = new ObjectInputStream(socket.getInputStream());
}

public void writeObject(Object o) throw IOException {
    out.writeObject(o);
    out.reset();
    out.flush();
}

public <T> T readObject() throw IOException {
    return (T) in.readObject();
}

public void close() throws IOException {
    in.close();
    out.close();
    socket.close();
}
于 2013-01-27T19:53:34.023 に答える
0

問題は、ObjectInputStreamが初期化時にデータを先読みすることです。

推奨される解決策は、Javaで新しいObjectInputStreamブロックを作成することです。ObjectInputStreamを初期化する前に必ずObjectOutputStreamを初期化して、2つが内部で使用する「ハンドシェイク」を開始できるようにします。

すべてのコードを制御せず、順序を変更できない場合は、データが利用可能になるまでOISの初期化を遅らせることを検討してください(InputStream.availableまたはそれをラップするバッファードストリームのマーク/読み取り/リセットなど)。

于 2013-01-27T19:37:26.657 に答える