【问题标题】:StreamCorruptedException when trying to pass InputStream尝试传递 InputStream 时出现 StreamCorruptedException
【发布时间】:2012-06-10 01:26:47
【问题描述】:

尝试将套接字InputStream 变量传递给线程以写入对象时出错。我有客户端和两个线程:第一个读取文本输入,第二个读取序列化对象。它们同时运行,因此我设置了 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;}
}

Lot 实现了Serializable。为什么抛出java.io.NotSerializableException? 我从第一个使用 BufferReader(Input stream) 获取数据的线程中成功获得了 Lot 对象。第二个线程无法读取对象可能是因为第一个线程是红色的。尽管InputStream is = socket.getInputStream() 变量定义为 volatile 并且必须确保线程安全协作,但似乎两个线程竞争套接字输入流......

【问题讨论】:

  • 请重新格式化您的代码块,它非常难以阅读。
  • 您的标题显示 StreamCorruptedException,堆栈跟踪也是如此。那你为什么要谈论 NotSerializableException?
  • 据我了解,首先必须对对象进行序列化,然后将其写入流(通过服务器)。之后客户端可以获得 StreamCorruptedException。
  • @RCola 你还没有回答我的问题。要么你得到NotSerializableException,要么你没有,根据堆栈跟踪你没有。那你为什么提到它?

标签: java multithreading sockets serialization


【解决方案1】:

在套接字的整个生命周期中使用单个 ObjectInputStream 和 ObjectOutputStream。

【讨论】:

  • 嗨,你能帮我确认一下吗?对于客户端,有一个ObjectInputStream 和一个ObjectOutputStream 用于套接字的生命周期。对于服务器来说,每个新的socket.accept连接实现一个ObjectInputStream和一个ObjectOutputStream是否正确?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多