Пакеты.

2,955
12
Мне не подходит CustomPayload, мне нужно свой пакет, как я знаю, но я не понимаю, как его хэнделить, так как в аргах пакет хэндлера Packet250CustomPayload
 
1,990
18
105
Всё иожно сделать через CustomPayload. Объясни, зачем тебе другой пакет и почему не подходит этот?
 
1,990
18
105
Покажи примерно как делаешь запись\чтение, на примерах.
 
2,955
12
Packet250CustomPayload p = new Packet250CustomPayload();
 ByteArrayInputStream bis = new ByteArrayInputStream(p.data);
 DataInputStream is = new DataInputStream(bis);
 int x = is.readInt();
 int y = is.readInt();
 int z = is.readInt();
Так читаю.
Packet250CustomPayload p = new Packet250CustomPayload();
 ByteArrayOutputStream bos = new ByteArrayOutputStream();
 DataOutputStream os = new DataOutputStream(bos);
os.writeInt(x);
os.writeInt(y);
os.writeInt(z);
        packet.data = bos.toByteArray();
Так пишу.
 
1,990
18
105
Что мешает абстрагироваться и сделать свои методы, куда можно кидать сразу кучу аргументов?
Ты думаешь в других пакетах по-другому? Там всё так же.
wlVCD3T.png

Пример метода записи:

Код:
void writeToPacket(int[] data) {
    for (int i = 0; i < data.length; i++)
      os.writeInt(data[i]);
}


и потом вызывать вот так:

Код:
writeToPacket(new int[] {x, y, z});
 
1,990
18
105
В любом случае придется это делать.
Или ты жертвуешь абстракцией (что везде и делают) и экономишь байты, дабы не отсылать отсылаемые типы (что способствует лагам) и читаешь всё напрямую в порядке записи (чтобы не перемешать байты и не получить вообще другие значения), или ты делаешь свой класс, где у каждого типа свой ID, отделяешь под него перед записью каждой переменной по байту и потом имеешь возможность запихать кучу типов в один лист и производить одинаково чтение и запись.
Выбирай сам.
Код:
public class TypeBase {
  public static HashMap<Byte, Class> idToClass = new HashMap<Byte, Class>();
  public static HashMap<Byte, Class> classToId = new HashMap<Byte, Class>();

  public static void addClass(byte id, Class cls) {
    idToClass.put(id, cls);
    classToId.put(cls, id);
  }
  public static void init() {
    addClass((byte)0, int.class);
    addClass((byte)1, short.class);
    addClass((byte)2, String.class);
    //and so on
  }

  public static byte getId(Class cls) {
    return classToId.get(cls);
  }

  public static Class getType(int i) {
    return idToClass.get(i);
  }
}

<... класс пакета ...>
public void writeObject(Object o) {
    byte id = TypeBase.getId(o.getClass());
    os.writeByte(id);
    switch (id) {
        case 0: os.writeInt((Integer)o); break;
        case 1: os.writeShort((Short)o); break;
        case 2: writeString((String)o, os); break;
    }
}

public void writeData(Object[] data) {
    os.writeByte(data.length);
    for (Object o : data)
      writeObject(o);
}

public void readData() {
    byte n = in.readByte();
    for (int i = 0; i < n; i++) {
      byte id = in.readByte();
      Class cls = TypeBase.getType(id);
      //узнаем класс и дальше читаем как надо, не забываем читать нужное количество байт
    }
}
Набросал на коленке, проверить пока негде. И недописал слегка, думаю, там уже разберешься. Всего лишь считать по нужному способу для нужного ID и потом кастануть в класс.
 
1,990
18
105
Но они не лучше. Потому что пользы от них ноль, вреда больше. Но если ты так хочешь - пожалуйста.
Вообще это называется низкоуровневое программирование, ковыряние байтиков, битиков и прочего.
Хотя, конечно, в данной ситуации это (пакеты) низкоуровневым программированием даже назвать нельзя. Например, кодек мп3 - можно, это - нет. Скорее что-то промежуточное.
 
Сверху