2014-02-10 4 views
0

Я работаю над реализацией сети Token Ring, я пытаюсь передать маркерный кадр из станции в кольцо, используя DatagramPacket. Преобразовать объект кадра в массив байтов с использованием этого:Де-сериализация объекта для объекта класса

public static byte[] serialize(Object obj) throws IOException { 
    ByteArrayOutputStream b = new ByteArrayOutputStream(); 
    ObjectOutputStream o = new ObjectOutputStream(b); 
    o.writeObject(obj); 
    return b.toByteArray(); 
} 

, а затем преобразовать его обратно с помощью этого:

public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream b = new ByteArrayInputStream(bytes); 
    ObjectInputStream o = new ObjectInputStream(b); 
    return o.readObject(); 
} 

Каждая станция работает два потока.

public void go() { 

t.println("Sending to: " + main_host_address); 
t.println("Station Address: " + station_address); 
t.println("MAC Address: " + MAC_Address); 


DatagramSocket socket; 
InetSocketAddress saddr; 

try { 
     saddr= new InetSocketAddress("localhost", main_host_address); 
     socket= new DatagramSocket(station_address); // Create a socket and a datagram from the buffer data 

     (new Thread(new receivingThread(socket))).start(); // start threads for receiving and sending 
     (new Thread(new sendingThread(socket, saddr, frame))).start(); 
    }catch(Exception e) { 
     e.printStackTrace(); 
}  
} 

..и все они получают от одного адреса - кольцо.

Теперь, в классе Ring, я пытаюсь преобразовать массив байтов, но он ничего не делает, я запускаю цикл while, но он не обходит цикл, как только он пытается преобразовать массив байтов в Frame объект.

public void run() { 
     byte [] buffer; 
     DatagramPacket packet; 
     //Receive the packet 
     try{ 
      buffer = new byte[5]; 
      int i = 0; 
      packet = new DatagramPacket(buffer, buffer.length); 
      int recievedData = 0; 

      while(true){ 
       t.println("Recieving...."); 
       socket.receive(packet); 

       Thread.sleep(2000); 

       recievedData = packet.getData()[0]; 
       t.println("Reciever: " + recievedData); 

       //here I'm trying a different way of getting the byte array 
       //Before, I had; byte [] data = packet.getData(); 
       //but it didnt work so i was trying this longer way 
       //and still the same result. 
       List<Byte> list = new ArrayList<Byte>(); 

       for(i = 0; i < packet.getData().length; i++){ 
        t.print(packet.getData()[i] + " "); 
        list.add(packet.getData()[i]); 
       } 

       Byte [] d = list.toArray(new Byte[list.size()]); 
       byte[] data = new byte[d.length]; 

       int j=0; 
       for(Byte b: d){ 
        data[j++] = b.byteValue(); 
       } 
       frame = (Frame) deserialize(data); //I think the problem is here 
       t.println("From frame: " + frame.SD[0]); 
      } 
     }catch(Exception e){ 

     } 
    } 

Как я могу исправить это, пожалуйста? Спасибо.

ответ

0

Вы должны десериализациями (packet.getData(), 0, packet.getLength()).

Других слов настроить API, так что эти дополнительные параметры смещения и длинами передаются на вашу десериализацию() метод, и используется при построении вашего ByteArrayInputStream.

Смежные вопросы