[1.6.4] Большие пакеты

Sio

23
0
Здравствуйте! Как можно реализовать отправку кучу данных пакетом(чтобы не было лаготрона)!Тип данных
string / int-x / int-y / int-z / int-2x / int-2y / int-2z / int-set / int-click ;
string / int-x / int-y / int-z / int-2x / int-2y / int-2z / int-set / int-click ;
string / int-x / int-y / int-z / int-2x / int-2y / int-2z / int-set / int-click ;
string / int-x / int-y / int-z / int-2x / int-2y / int-2z / int-set / int-click ;
string / int-x / int-y / int-z / int-2x / int-2y / int-2z / int-set / int-click ;
и так далее.

кто поможет дам монетку на WMR​
 
По сути вот так должен выглядить твой алгоритм передачи данных:
1. На входе объект с данными -> 
2. С помощью Gson сериализуешь свой объект в json -> 
3. Через gzip сжимаешь свой json в байты ->
4. Передаешь на клиент ->
5. На клиенте из байт разжимаешь в json с помощью gzip ->
6. С помощью Gson десериализуешь в объект
[merge_posts_bbcode]Добавлено: 03.02.2016 19:59:54[/merge_posts_bbcode]

Как это выглядит в коде:
Методы для работы с gzip:
Код:
   /**
    * Применяет gzip алгоритм на данную строку
    */
   public static byte[] compress(String s) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            GZIPOutputStream gzip = new GZIPOutputStream(bos);
            OutputStreamWriter osw = new OutputStreamWriter(gzip, StandardCharsets.UTF_8);
            osw.write(s);
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bos.toByteArray();
    }

    /**
     * Конвертирует gzip данные в строку
     */
    public static String decompress(byte[] bytes) throws IOException {
        InputStreamReader isr = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(bytes)),
                StandardCharsets.UTF_8);
        StringWriter sw = new StringWriter();
        char[] chars = new char[1024];
        for (int len; (len = isr.read(chars)) > 0;) {
            sw.write(chars, 0, len);
        }
        return sw.toString();
    }

Сериализация и десериализация твоего объекта:
Код:
 /**
  * Сериализует объект в набор байтов, которые можно передавать на клиент
  */
 public static byte[] serialize(Object data){
    String json = new Gson().toJson(data); //сериализуем в json
    byte[] data = compress(json); //применяем компрессию
    return data; 
 }

 /**
  * Десериализует байты в объект
  */
 public static Object deserialize(byte[] data){
    String json = decompress(data);
    Object object = new Gson().fromJson(json, Object.class);
    return object;
 }

Важно: Не забудь в этом коде тип Object сменить на тип твоего объекта
 
RedEnergy написал(а):
По сути вот так должен выглядить твой алгоритм передачи данных:
1. На входе объект с данными -> 
2. С помощью Gson сериализуешь свой объект в json -> 
3. Через gzip сжимаешь свой json в байты ->
4. Передаешь на клиент ->
5. На клиенте из байт разжимаешь в json с помощью gzip ->
6. С помощью Gson десериализуешь в объект
[merge_posts_bbcode]Добавлено: 03.02.2016 19:59:54[/merge_posts_bbcode]

Как это выглядит в коде:
Методы для работы с gzip:
Код:
   /**
    * Применяет gzip алгоритм на данную строку
    */
   public static byte[] compress(String s) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            GZIPOutputStream gzip = new GZIPOutputStream(bos);
            OutputStreamWriter osw = new OutputStreamWriter(gzip, StandardCharsets.UTF_8);
            osw.write(s);
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bos.toByteArray();
    }

    /**
     * Конвертирует gzip данные в строку
     */
    public static String decompress(byte[] bytes) throws IOException {
        InputStreamReader isr = new InputStreamReader(new GZIPInputStream(new ByteArrayInputStream(bytes)),
                StandardCharsets.UTF_8);
        StringWriter sw = new StringWriter();
        char[] chars = new char[1024];
        for (int len; (len = isr.read(chars)) > 0;) {
            sw.write(chars, 0, len);
        }
        return sw.toString();
    }

Сериализация и десериализация твоего объекта:
Код:
 /**
  * Сериализует объект в набор байтов, которые можно передавать на клиент
  */
 public static byte[] serialize(Object data){
    String json = new Gson().toJson(data); //сериализуем в json
    byte[] data = compress(json); //применяем компрессию
    return data; 
 }

 /**
  * Десериализует байты в объект
  */
 public static Object deserialize(byte[] data){
    String json = decompress(data);
    Object object = new Gson().fromJson(json, Object.class);
    return object;
 }

Важно: Не забудь в этом коде тип Object сменить на тип твоего объекта
Спасибо попробую!)
 
Не знаю зачем здесь json, но если так хочется, то пусть будет.
Странно у тебя там всё, можно же юзать удобный Data[Input/Output]Stream.
Да, он медленнее немного, но тут пару байтов передается, так что разницы нет никакой.
 
Agravaine написал(а):
Не знаю зачем здесь json, но если так хочется, то пусть будет.
Странно у тебя там всё, можно же юзать удобный Data[Input/Output]Stream.
Да, он медленнее немного, но тут пару байтов передается, так что разницы нет никакой.
json весит меньше чем просто сериализованный объект
 
Назад
Сверху