2013-04-16 3 views
1

я получаю это исключение при попытке отправить объекты через UDP сокет в JavaКак разрешить StreamCorruptedException: недопустимый заголовок потока в 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";}} 

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

ответ

2

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

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

+0

Спасибо .. Он решил ошибку .. – Arella