Как разрешить StreamCorruptedException: неверный заголовок потока в java?

Я получаю это исключение при попытке отправить объекты через сокет UDP в java

java.io.StreamCorruptedException: недопустимый заголовок потока: 00000000

Вот код отправителя: `

public class Epl_Client implements Serializable{
public static void main(String[] args )
{
 try{
  ParseMessage pm = new PaseMessage();  
  DatagramSocket Sock;
  Sock = new DatagramSocket();
  DatagramPacket Dp;
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(4 * 1024);
  ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
  objectOutputStream.writeObject(lg);
  byte[] objectBytes = byteArrayOutputStream.toByteArray();
  Dp = new DatagramPacket(objectBytes,   objectBytes.length,InetAddress.getByName("localhost"),9876);

  Sock.send(Dp);

    Sock.close();

 }
 catch (Exception e){
 System.out.println("exception caught" + e);
 }
}}

Код для приемника:

public class ClassServer{
public static void main(String[] args){
    ParseMessage pm=new ParseMessage();

    try{         
        byte[] recvBuf = new byte[5000];
        while(true){ 
                DatagramSocket serverSocket = new DatagramSocket(9876);
               ByteArrayInputStream bais = new ByteArrayInputStream(recvBuf);
               ObjectInputStream objectInputStream = new ObjectInputStream(bais);
               pm= (ParseMessage)objectInputStream.readObject();
               System.out.println(pm.message);
               bais.close();
               objectOutputStream.close();
              }
        }
        catch(Exception e)
        {
            System.out.println("Exceptiom"+e);
        }  
}}

И класс

public class ParseMessage  implements Serializable{
  String message; 
  public ParseMessage() 
 { message="Inavalid";}}

Может ли кто-нибудь помочь решить эту ошибку?


person Arella    schedule 16.04.2013    source источник


Ответы (1)


На самом деле вы никогда ничего не получаете из сокета. Посмотрите на свой код — вы создаете DatagramSocket и больше никогда к нему не обращаетесь. Вы всегда строите ByteArrayInputStream, обертывая массив, полный нулей.

Вам нужно вызвать DatagramSocket.receive, а затем использовать длину полученных данных при построении ByteArrayInputStream. Однако вы должны быть уверены, что сможете поместить все данные в один пакет. Вы уверены, что вам не нужен потоковый протокол?

person Jon Skeet    schedule 16.04.2013