繁体   English   中英

java.io.StreamCorruptedException:无效 stream header:75720002

[英]java.io.StreamCorruptedException: invalid stream header: 75720002

我正在创建一个服务器-客户端应用程序,其中服务器向所有连接的客户端发送一个 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();
    }
}

BufferedReader可以从套接字中缓冲比您已经阅读的更多的数据。 因此,在客户端,您的byte[]的 header 可能已经被您的inFromServer读取器读取和缓冲,并且您的ObjectInputStream将无法使用。

不要做那种事。 要么“手动”执行所有编组(使用PrintWriter / BufferedReader对),要么使用 object 序列化和ObjectOutputStream / ObjectInputStream完成所有操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM