Я пытаюсь спроектировать архитектуру сервер / клиент, и я хотел бы поблагодарить вас, ребята, чтобы определить лучший способ представления и анализа различных типов пакетов. Каждый тип пакета должен быть проанализирован по-разному. Ниже представлен тип пакетов, которые я вижу.
[*packet_type*][length][variable length data]
*packet_type* describes the type of packet we're sending (client login, server returning authentication, data, etc)
length describes how much data to read
variable length data contains the info to be sent. it will be specialized based on the packet_type. the data will be variable regardless of
Я изучил структуру tcphdr и думаю, что смогу использовать заголовок аналогичного типа для представления * package_type * и длины. Затем я использовал бы String для представления данных.
public class Packet {
public enum PKT_TYPE {
CL_REGISTER,
CL_LOGIN,
SRV_AUTH,
SRV_GAME_INFO,
}
PKT_TYPE _packet_type;
int _length;
String _data;
}
Теперь, когда есть общая база, я решил, что могу реализовать классы и методы отправки / получения для каждого * package_type *. Тем не менее, я чувствую, что это не очень масштабируемо, и его будет очень сложно поддерживать. (Грубый, псевдо) пример этого будет
public class Packet {
...
public class Pkt_CL_LOGIN extends Packet {
String _loginname;
String _password;
public boolean send() {
//socket.write(CL_LOGIN, length, _loginname+_password);
}
public Pkt_CL_LOGIN parse(String data) {
//removed header already, so first byte will be data
//extract login + password
_loginname = login;
_password = password;
return this;
}
}
public Packet receive() {
//read from socket
//parse header for packet_type
switch (packet_type)
case CL_LOGIN:
return (new Pkt_CL_LOGIN()).parse(data);
}
}
Может кто-нибудь дать мне несколько рекомендаций о том, как реализовать это по-другому? Я не совсем уверен, есть ли он, но, возможно, кто-то с большим опытом может дать мне некоторое представление (например, как они это делают в многопользовательских играх и т. Д.)
Спасибо!