Я пытаюсь создать простой сетевой клиент. Клиент должен иметь возможность записывать в очередь (буфер), а второй поток должен брать этот буфер и записывать его на сервер.Попытка заполнить буфер, пока буфер записывается на канал
Я попробовал это с 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, поэтому я пробую его без рамки)
Благодарим за предложение. Я думал о системах LightWight, таких как Kryonet или Pyronet, но поскольку я использую это на Android, я думал, что прямое программирование будет лучше для производительности. С другой стороны, я хотел научиться NIO, так почему бы не мучить себя? : D –