2011-12-12 100 views
3

我想实现对象序列化,但卡在StreamCorruptedException。java.io.StreamCorruptedException:无效的流标头:00000000

在服务器端:

public class MulticastServer { 
       public static void main(String[] args) throws java.io.IOException { 
       new MulticastServerThread().start(); 
       } 
} 

的呼叫:

public class MulticastServerThread extends QuoteServerThread { 
       boolean moreQuotes=true; 
public void run() { 
    while (moreQuotes) { 
    try { 
    byte[] buf = new byte[256]; 
    String dString="Server"; 
    System.out.println(dString); 
    buf = dString.getBytes(); 

    InetAddress group = InetAddress.getByName("230.0.0.1"); 
    DatagramPacket packet = new DatagramPacket(buf, buf.length, 
               group, 4446); 

    socket.send(packet); 

    ObjectInputStream is=null; 

    ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf); 
    is = new ObjectInputStream(new BufferedInputStream(byteStream)); 

    Object o1=(Object)is.readObject(); 
    System.out.println(o1.a); 

    is.close(); 
    socket.close(); 
    }}}} 

和对象类的服务器和客户端:

public class Object implements Serializable{ 
private static final long serialVersionUID=1L; 
int a=10; 
} 

和客户端代码:

public class MulticastClient { 
public static void main(String[] args) throws IOException { 
MulticastSocket socket = new MulticastSocket(4446); 
InetAddress address = InetAddress.getByName("230.0.0.1"); 
socket.joinGroup(address); 

Object o1=new Object(); 

DatagramPacket packet; 

for (int i = 0; i < 5; i++) { 
    byte[] buf = new byte[256]; 
    packet = new DatagramPacket(buf, buf.length); 
    socket.receive(packet); 

    String received = new String(packet.getData()); 
    System.out.println("received data" +received); 

    ObjectOutputStream os = null; 
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000); 
      os = new ObjectOutputStream(new BufferedOutputStream(byteStream)); 
      os.flush(); 
      os.writeObject((Object)o1); 
      System.out.println(o1.a); 
      os.flush(); 
} 
socket.leaveGroup(address); 
socket.close(); 
} 
} 

我所做的这一切:

  1. 把所有类别相同的路径下,在两台机器上
  2. 重视休息,并尝试找出问题的所在

能有人帮我?谢谢!

+0

我很努力地看到客户端和服务器中的ByteArray [Input | Output]流是如何工作的。你期望他们连接吗? – sudocode

+0

哦。我现在明白了。但是如何让服务器等到客户端发送它? –

+0

您应该能够接收()等待,直到有数据包。 –

回答

1

如果您尝试通过UDP进行对象序列化,则需要将对象序列化到数据包的字节数组中,然后从接收端读取该对象。有一篇旧的Java World文章:Object transport via datagram packets,您可能会发现它很有用。

它看起来像你想实现一个双向通信:

server -> send packet 
client -> receive packet 
client -> send object 
server -> receive object 

我不知道这是怎么回事制定出适合你(特别是如果你有多个客户端)。

但至少将需要以下变化得到任何工作:

  • 您的服务器代码将需要发送的数据包后做阻塞receive电话。
  • 客户端代码将需要send数据包中的对象。
相关问题