2012-06-06 99 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

相關問題