我正在创建一个服务器 - 客户端应用程序,其中服务器将pdf文件发送到所有连接的客户端。问题是我得到了这个错误,我搜索了一个解决方案,但无法得到任何解决方案。这是错误
java.io.StreamCorruptedException: invalid stream header: 75720002
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at StudentThread.run(StudentThread.java:102)
这是服务器发送代码:
public void run()
{
try
{
String modifiedSentence;
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
inFromServer = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())), true);
//String sentence;
System.out.println("TeachID. "+id);
modifiedSentence = in.readLine();
System.out.println("Student "+id+" says:"+modifiedSentence);
arrS=modifiedSentence.split(" ");
out.println("Hello "+arrS[2]+","+id);
studName=arrS[2];
((DefaultListModel) Teacher.made_list.getModel()).addElement(studName);
while( true )
{
modifiedSentence = in.readLine();
arrS=modifiedSentence.split(" ");
if(arrS[0].equals("AcceptFile"))
{
try
{
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
byte[] buffer = (byte[])ois.readObject();
String pic="copyServer"+id+".pdf";
System.out.println(pic);
FileOutputStream fos = new FileOutputStream(pic);
fos.write(buffer);
fos.flush();
fos.close();
}
catch(Exception e)
{
System.out.println("Exception writing");
}
}
}
catch (IOException e)
{
}
finally
{
try
{
socket.close();
}
catch(IOException e)
{
}
}
}
public void sendF(String fn,Teacher teach)
{
try{
out.println("AcceptFile,");
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()) ;
FileInputStream fis = new FileInputStream(fn);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
//ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()) ;
oos.writeObject(buffer);
oos.flush();
fis.close();
}
catch(Exception e){
e.printStackTrace();
}
}
public void sendThread(String elem, Teacher teach)
{
out.println(elem);
//System.out.println ("Thread id is " + this.id);
System.out.println(this.socket.getInetAddress());
}
以下是接收代码的客户:
public void run()
{
try
{
out=new PrintWriter(socket.getOutputStream(), true);
out.println("Hello Server "+name+",");
String modifiedSentence;
BufferedReader inFromServer = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
modifiedSentence = inFromServer.readLine();
System.out.println( modifiedSentence );
arrT=modifiedSentence.split(",");
if(arrT[0].equals("Hello "+name))
{
studId=Integer.parseInt(arrT[2]);
System.out.println("My Id="+studId);
}
while( true )
{
modifiedSentence = inFromServer.readLine();
System.out.println( modifiedSentence );
arrT=modifiedSentence.split(",");
if(arrT[0].equals("AcceptFile"))
{
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
byte[] buffer = (byte[])ois.readObject();
String pic="copyServer"+studId+".gif";
System.out.println(pic);
FileOutputStream fos = new FileOutputStream(pic);
fos.write(buffer);
fos.flush();
fos.close();
}
}
}
catch( Exception e )
{
e.printStackTrace();
}
}
答案 0 :(得分:4)
BufferedReader
可以缓冲来自套接字的更多数据,而不是您已经阅读过的数据。因此,在客户端,您的byte[]
读者可能已经阅读并缓存了inFromServer
的标题,并且ObjectInputStream
无法使用。{/ p>
不要那样做。您可以“手动”(使用PrintWriter
/ BufferedReader
对)完成所有编组操作,也可以使用ObjectOutputStream
/ ObjectInputStream
进行对象序列化。