嘗試將套接字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且必須確保線程安全協作....
請重新格式化您的代碼塊,這是難以置信的閱讀。 –
你的標題說StreamCorruptedException,堆棧跟蹤也是如此。那麼你爲什麼要談論NotSerializableException呢? – EJP
據我所知,首先對象必須被序列化,然後寫入流(由服務器)。比客戶端可以得到StreamCorruptedException之後。 –