2015-07-20 2 views
0

Im, создающий приложение, которое должно отправить класс на сервер, написанный на C++, с использованием Sockets. Класс состоит из переменных как Ints. Я хочу преобразовать класс java в байты, а затем отправить его через сокет в виде пакета. Сервер ожидает 8 байтов для размера пакета. Когда я пытаюсь преобразовать свой объект, я получаю более 8 байтов. Как еще я могу отправить свой объект на сервер? Кроме того, мой код ниже отправляет 4 байта данных в два байта с двумя байтами. Почему это так?Клиент Android с удаленным сервером

public void connect2() { 
     String serverHostname = new String("My IP"); 
     ObjectOutputStream out2 = null; 
     ObjectInputStream in2 = null; 

     try { 

      echoSocket = new Socket(serverHostname, MYPORT); 
      StatusPacket p = new StatusPacket(); 

     byte[] data = new byte[8]; 
     data = serializeObject(p); 
     int j = data.length; 

      out2 = new ObjectOutputStream(echoSocket.getOutputStream()); 
      out2.flush(); 
      in2 = new ObjectInputStream(echoSocket.getInputStream()); 
      DataOutputStream dOut = new  DataOutputStream(echoSocket.getOutputStream()); 


       out2.write(data); 

      out2.close(); 
      in2.close(); 
      echoSocket.close(); 


     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host: " + serverHostname); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for " 
        + "the connection to: " + serverHostname); 
      System.exit(1); 
     } 


    } 

ответ

0

ObjectOutputStream и ObjectInputStream использовать механизмы сериализации Java, которая включает в себя намного больше информации, чем просто значение класса собственности. Вы не хотите иметь дело с теми, что содержатся в коде на C++, поэтому я рекомендую удалить весь код сериализации и эти два потока из вашего кода.

Поскольку вы уже знаете, что хотите на уровне байтов, вы действительно должны использовать этот DataOutputStream. Он позволяет передавать скалярные типы данных, такие как байты, int, long и т. Д. Без каких-либо накладных расходов. Просто получите эти два 32-битных целых числа от вашего объекта и передайте их DataOutputStream.writeInt (..), и вы настроены.

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