- 1,196
- 31
- 183
Ку гайс, давно не спрашивал ничего тут, грустно видеть, как некогда великий форум помирает...
Недавно столкнулся с такой ошибкой:
Примерно два дня гуглежа, день поиска тут, попытки самому отловить эту ошибку ни к чему не привели. Знаю только в какой момент отваливается, примерно наметил код, где может отваливаться, но поймать за хвост эту штуку я так и не смог.
Суть в чем: кликаем по кнопке в гуи, клиент запрашивает данные у сервера, сервер шлет их клиенту, и по данным заполняется скролл дата (лист String, короче). В некоторый момент при нажатии на эту кнопку данные не заполняются, игрок перестает получать вообще все пакеты и через секунд 10 отваливается с ошибкой выше. Перезаходишь, все нормально до последующего такого же эксепшна
Тестили вдвоем, у него данная ошибка встречается намного чаще, моя с шансом 1% примерно. Куда можно подкопать?
Код примерно такой:
Серверу чихать что случилось в момент вылета игрока, поэтому думаю, что нетти поток где то жрет дозу говнища и отваливается, не указывается где конкретно он это говно взял. Все гуру, прошу помощи
Недавно столкнулся с такой ошибкой:
Java:
[23:48:59] [Netty Client IO #1/ERROR] [FML/]: NetworkDispatcher exception
java.io.IOException: Удаленный хост принудительно разорвал существующее подключение
at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_202]
at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:1.8.0_202]
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:1.8.0_202]
at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:1.8.0_202]
at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:1.8.0_202]
at io.netty.buffer.UnpooledUnsafeDirectByteBuf.setBytes(UnpooledUnsafeDirectByteBuf.java:436) ~[UnpooledUnsafeDirectByteBuf.class:?]
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:870) ~[AbstractByteBuf.class:?]
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:208) ~[NioSocketChannel.class:?]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:87) [AbstractNioByteChannel$NioByteUnsafe.class:?]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:480) [NioEventLoop.class:?]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447) [NioEventLoop.class:?]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:341) [NioEventLoop.class:?]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [SingleThreadEventExecutor$2.class:?]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_202]
Суть в чем: кликаем по кнопке в гуи, клиент запрашивает данные у сервера, сервер шлет их клиенту, и по данным заполняется скролл дата (лист String, короче). В некоторый момент при нажатии на эту кнопку данные не заполняются, игрок перестает получать вообще все пакеты и через секунд 10 отваливается с ошибкой выше. Перезаходишь, все нормально до последующего такого же эксепшна
Тестили вдвоем, у него данная ошибка встречается намного чаще, моя с шансом 1% примерно. Куда можно подкопать?
Код примерно такой:
Отправка запроса с клиента на сервак:
public static void sendData(final EnumPacketServer enu, final Object... obs) {
ByteBuf buffer = Unpooled.buffer();
try {
if(!Server.fillBuffer(buffer, enu, obs))
return;
CustomNpcs.Channel.sendToServer(new FMLProxyPacket(buffer, "CustomNPCs"));
} catch (IOException e) {
e.printStackTrace();
}
}
Чтение данных с сервера:
public static void setScrollData(ByteBuf buffer) {
GuiScreen gui = Minecraft.getMinecraft().currentScreen;
if(gui == null)
return;
try {
int size = buffer.readInt();
for(int i = 0; i < size; i++){
int id = buffer.readInt();
String name = Server.readString(buffer);
data.put(name, id);
}
} catch (Exception e) {
//Изначально здесь не было обработки эксепшона, я ее добавлял, чтобы появился лог выше (его раньше не было)
//Для более точно ханла ошибки еще добавил Sysout("error in this clazz"), но оно не вывелось
}
if(gui instanceof GuiNPCInterface && ((GuiNPCInterface)gui).hasSubGui()){
gui = (GuiScreen) ((GuiNPCInterface)gui).getSubGui();
}
if(gui instanceof GuiContainerNPCInterface && ((GuiContainerNPCInterface)gui).hasSubGui()){
gui = (GuiScreen) ((GuiContainerNPCInterface)gui).getSubGui();
}
if(gui instanceof IScrollData)
((IScrollData)gui).setData(new Vector<String>(data.keySet()), data);
data = new HashMap<String,Integer>();
}
}
Серверу чихать что случилось в момент вылета игрока, поэтому думаю, что нетти поток где то жрет дозу говнища и отваливается, не указывается где конкретно он это говно взял. Все гуру, прошу помощи