2012-06-06 103 views
1

尝试将套接字InputStream变量传递给写入对象的线程时发生错误。我有客户端和两个线程:第一次读取文本输入,第二次读取序列化的对象。他们跑同步,因此我设置易变static InputStream socketIs;。是对的吗?如何解决它?尝试通过InputStream时发生StreamCorruptedException

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(输入流)获取数据的第一个线程成功获得Lot对象。第二个线程无法读取对象,可能是因为它是第一个线程的红色。看起来好像两个线程竞争套接字输入流,尽管事实上InputStream is = socket.getInputStream()变量定义为volatile且必须确保线程安全协作....

+0

请重新格式化您的代码块,这是难以置信的阅读。 –

+0

你的标题说StreamCorruptedException,堆栈跟踪也是如此。那么你为什么要谈论NotSerializableException呢? – EJP

+0

据我所知,首先对象必须被序列化,然后写入流(由服务器)。比客户端可以得到StreamCorruptedException之后。 –

回答

1

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

+0

嗨,你能为我确认一些事吗?对于客户端来说,在套接字的生命周期中有一个ObjectInputStream和一个ObjectOutputStream。对于服务器,为每个新的socket.accept连接实现一个ObjectInputStream和一个ObjectOutputStream是否正确? – Joyce

相关问题