Я пытаюсь сделать простой сетевой клиент. Клиент должен иметь возможность записи в очередь (буфер), а второй поток должен взять этот буфер и записать его на сервер.
Я попробовал это с java.nio
и создал Thread
со статическим ByteBuffer
. Этот ByteBuffer
используется в while(true)
из Thread
для записи в канал.
В моем главном цикле в какой-то момент я помещаю несколько байтов в статический буфер с помощью метода put()
.
В режиме отладки я приостановил поток записи канала, а затем заполнил буфер с помощью основного цикла программы (просто нажал «A» для записи в буфер).
После трех или четырех нажатий кнопок я снова запустил процесс записи канала, и он работал просто отлично.
Но когда я просто пытаюсь запустить программу, я получаю ошибку переполнения буфера в потоке основного цикла. Я полагаю, что моя программа пытается поместить данные в буфер, пока мой поток записи канала обращается к нему. Я пытался использовать синхронизированное ключевое слово вокруг обеих частей в обоих потоках, но это не помогло.
Основной цикл:
[...]
if(Gdx.app.getInput().isKeyPressed(Input.Keys.A) && (now.getTime() - lastPush.getTime()) > 1000 )
{
lastPush = now;
//synchronized (PacketReader.writeBuffer)
//{
PacketReader.writeBuffer.put(("KeKe").getBytes());
//}
}
[...]
Моя тема с именем "PacketReader" (ну, на самом деле это чтение и запись):
class PacketReader implements Runnable
{
public static ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
[...]
public void run()
{
while (true) {
[...]
if (selKey.isValid() && selKey.isWritable())
{
SocketChannel sChannel = (SocketChannel)selKey.channel();
//synchronized (PacketReader.writeBuffer)
//{
if(PacketReader.writeBuffer.hasRemaining())
{
PacketReader.writeBuffer.flip();
int numBytesWritten = sChannel.write(PacketReader.writeBuffer);
PacketReader.writeBuffer.flip();
}
//}
}
[...]
Есть идеи, как создать такую буферизованную систему записи? Я думаю, что это общая проблема, но я не знаю, что искать. Все учебные пособия по NIO считают, что буфер заполнен в цикле канала.
В конце я пытаюсь запустить программу, в которой сетевой компонент запускается один раз, и в моей программе я просто хотел использовать статический метод отправки для отправки пакетов, не думая об обработке очереди или ожидании очереди.
Может быть, есть где-нибудь учебник? В большинстве игр должна использоваться похожая концепция, но я не смог найти ни одной простой Java-игры с открытым исходным кодом с реализацией NIO (я буду использовать ее для Android, поэтому я пробую ее без фреймворка)