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();
}
}