просто раньше не было такой ош. и все работало.
на сервер был прислан пакет AuthLogin, в котором происходит чтение данных (_loginName, _playKey1, _playKey2, _loginKey1, _loginKey2)
Java:
@Override
protected void readImpl()
{
_loginName = readString().toLowerCase();
_playKey2 = readInt();
_playKey1 = readInt();
_loginKey1 = readInt();
_loginKey2 = readInt();
}
Так вот, ошибка судя по всему была вызвана тем, что в пакете не оказалось данных для чтения (_playKey1, _playKey2, _loginKey1, _loginKey2), или же данные были не корректны.
делаем проверку от тут
if (getAvailableBytes() == 0)
{
return;
}
Речь наверное о методе remaining, поскольку getAvailableBytes отсутствует. Не суть.
Но ты же понимаешь, что делая подобное ты пропустишь выполнения метода readImpl, спровоцировав тем самым последующее выполнение метода runImpl?
Ибо непонятно накуя, мобиус переписал реализацию, сделав метод readImpl возвращающим void. Ну то есть если метод readImpl не выбросив какое либо исключение, вернет true, продолжит выполнять следующий метод runImpl пакета.
Java:
@Override
public boolean read()
{
try
{
readImpl();
return true;
}
catch (Exception e)
{
PacketLogger.warning("Client: " + getClient() + " - Failed reading: " + getClass().getSimpleName() + " ; " + e.getMessage());
PacketLogger.warning(CommonUtil.getStackTrace(e));
}
return false;
}
Java:
private void execute(ReadablePacket<T> packet)
{
if (packet.read())
{
// LOGGER.info("packet " + packet + " was read from client " + packet.client);
_executor.execute(packet);
}
}
Тут мы видим, что выполнив readImpl без исключений, метод read вернет true, что спровацирует выполнение runImpl, что в данном случае будет не к чему.
По логике вещей, это должно было выглядеть примерно так
Java:
public abstract class ClientPacket extends ReadablePacket<GameClient>
{
@Override
public boolean read()
{
try
{
return readImpl();
}
catch (Exception e)
{
PacketLogger.warning("Client: " + getClient() + " - Failed reading: " + getClass().getSimpleName() + " ; " + e.getMessage());
PacketLogger.warning(CommonUtil.getStackTrace(e));
}
return false;
}
protected abstract boolean readImpl();
...
}
Java:
public class AuthLogin extends ClientPacket
{
// loginName + keys must match what the loginserver used.
private String _loginName;
private int _playKey1;
private int _playKey2;
private int _loginKey1;
private int _loginKey2;
@Override
protected boolean readImpl()
{
_loginName = readString().toLowerCase();
if (remaining() == 0)
{
return false;
}
_playKey2 = readInt();
_playKey1 = readInt();
_loginKey1 = readInt();
_loginKey2 = readInt();
return true;
}
А ведь в теории подобное поможет избавиться от засора тредпула выполнением ненужных задач, не выполняя подобные задачи:
Java:
private void execute(ReadablePacket<T> packet)
{
if (packet.read())
{
// LOGGER.info("packet " + packet + " was read from client " + packet.client);
_executor.execute(packet);
}
}