Java 尝试传递InputStream时StreamCorruptedException
尝试将套接字Java 尝试传递InputStream时StreamCorruptedException,java,multithreading,sockets,serialization,Java,Multithreading,Sockets,Serialization,尝试将套接字InputStream变量传递给线程以写入对象时出错。我有客户端和两个线程:第一个读取文本输入,第二个读取序列化对象。它们同时运行,因此我设置了volatile静态输入流socketIs。是这样吗?如何修复它 java.io.StreamCorruptedException: invalid stream header: 57656C63 at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at
InputStream
变量传递给线程以写入对象时出错。我有客户端和两个线程:第一个读取文本输入,第二个读取序列化对象。它们同时运行,因此我设置了volatile静态输入流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)
服务器:
...
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);
...
调试在服务器端显示错误,同时尝试输出.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();
}
}
}
地段:
批次实现可序列化的
。为什么抛出java.io.NotSerializableException
?
我已经从使用BufferReader(输入流)获取数据的第一个线程成功地获得了Lot对象。第二个线程无法读取对象,可能是因为它被第一个线程染成红色。似乎有两个线程在争夺套接字输入流,尽管InputStream是=socket.getInputStream()
变量定义为volatile,并且必须确保线程安全协作 在套接字的生命周期中使用单个ObjectInputStream和ObjectOutputStream。在套接字的生命周期中使用单个ObjectInputStream和ObjectOutputStream。请重新格式化您的代码块,读起来非常困难。您的标题是StreamCorruptedException,堆栈跟踪也是如此。那个么你们为什么要谈论NotSerializableException呢?正如我所理解的,首先必须序列化对象,然后(通过服务器)将其写入流。之后,客户端可以获得StreamCorruptedException。@RCola您还没有回答我的问题。要么您得到了NotSerializableException
,要么您没有,根据堆栈跟踪,您没有得到。那么你为什么要提到它呢?请重新格式化你的代码块,它非常难以阅读。你的标题是StreamCorruptedException,堆栈跟踪也是如此。那个么你们为什么要谈论NotSerializableException呢?正如我所理解的,首先必须序列化对象,然后(通过服务器)将其写入流。之后,客户端可以获得StreamCorruptedException。@RCola您还没有回答我的问题。要么您得到了NotSerializableException
,要么您没有,根据堆栈跟踪,您没有得到。那你为什么提到它?嗨,你能帮我确认一下吗?对于客户端,在套接字的生命周期中有一个ObjectInputStream
和一个ObjectOutputStream
。对于服务器,为每个新套接字实现一个ObjectInputStream
和一个ObjectOutputStream
是否正确。接受连接?嗨,你能帮我确认一下吗?对于客户端,在套接字的生命周期中有一个ObjectInputStream
和一个ObjectOutputStream
。对于服务器,为每个新套接字实现一个ObjectInputStream
和一个ObjectOutputStream
是否正确?
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;}
}