## Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 00000000

Exception in thread “main” java.io.StreamCorruptedException: invalid stream header: 00000000

其实这是一个单纯IO流的问题,原因很简单,就是你传进去的byte数组是空的,一开始debug找到的错误是这句话:”byte[] datas=new byte[1024*60];“。但是将该式改成“ byte[] datas=baos.toByteArray();”仍然出现该错误,后来开始关注是否是IO流的问题,看到最后才发现原来是 oos.flush();oos.close();
这两句话没写,即水龙头没有关,系统认为还没有结束,datas就没有数据。
UdpClient(发送端)

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Date;

/**1、使用DatagramSocket 指定端口 创建接收端
 * 2、准备数据转成字节数组
 * 3、封装成DatagramPacket包裹,到达指定目的地
 * 4、发送send
 * 5、释放资源
 * Created by sugar on 2019/10/21.
 */
public class UdpObjClient {
    public static void main(String[] args) throws IOException {
        //    1、使用DatagramSocket 指定端口 创建发送端
        DatagramSocket socket=new DatagramSocket(8989);
        //    * 2、准备数据转成字节数组
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(baos));
        oos.writeObject("Hello world!");
        oos.writeObject(new Date());
        Employee employee=new Employee("TLP",0.5);
        oos.writeObject(employee);

        //    * 3、封装成DatagramPacket包裹,到达指定目的地
		//byte[] datas=new byte[1024*60];
        byte[] datas=baos.toByteArray();
         os.close();
        DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",8088));

        //    * 4、发送send
        socket.send(packet);
        //    * 5、释放资源
        socket.close();
    }

}

UdpServer(接收端)

public class UdpObjServer {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        * 1、使用DatagramSocket 指定端口 创建接收端
        DatagramSocket socket=new DatagramSocket(8088);
//        * 2、准备容器封装成包裹
        byte[] contains=new byte[1024*60];
        DatagramPacket packet=new DatagramPacket(contains,0,contains.length);
//        * 3、阻塞式接受包裹receive
        socket.receive(packet);
//        * 4、分析数据 将字节数组还原成对应的类型
        byte[] data=packet.getData();
        ObjectInputStream ois = new ObjectInputStream(
                new BufferedInputStream(
                        new ByteArrayInputStream(data)));
        Object str = ois.readObject();
        if(str instanceof String){
            String s=(String)str;
            System.out.println(s);
        }
        Object date=ois.readObject();
        if(date instanceof Date){
            Date date1=(Date)date;
            System.out.println(date1);
        }
        Object obj = ois.readObject();
        if(obj instanceof Employee){
            Employee eeeEmployee = (Employee) obj;
            System.out.println(eeeEmployee.getSalary());
        }
//        * 5、释放资源
        socket.close();
    }
}

你可能感兴趣的:(JAVA)