Хобрук: Ваш путь к мастерству в программировании

Как читать и записывать данные через клиент Java Nio в Android

Я успешно взаимодействую с клиентским сервером в java, но теперь мне нужно написать клиент в Android, а не в java.

клиент: открытый класс ExampleClient2 {

public static void main(String[] args) throws IOException,
InterruptedException {
    int port = 1114;
    SocketChannel channel = SocketChannel.open();


    // we open this channel in non blocking mode
    channel.configureBlocking(false);
    channel.connect(new InetSocketAddress("192.168.1.88", port));

    if(!channel.isConnected())
    {
        while (!channel.finishConnect()) {
            System.out.println("still connecting");
        }
    }
    System.out.println("connected...");


    while (true) {
        // see if any message has been received
        ByteBuffer bufferA = ByteBuffer.allocate(60);
        int count = 0;
        String message = "";
        while ((count = channel.read(bufferA)) > 0) {
            // flip the buffer to start reading
            bufferA.flip();
            message += Charset.defaultCharset().decode(bufferA);

        }

        if (message.length() > 0) {
            System.out.println("message " + message); 
            if(message.contains("stop"))
            {
                System.out.println("Has stop messages");
                //                  break;
            }
            else
            {
                // write some data into the channel
                CharBuffer buffer = CharBuffer.wrap("Hello Server stop from client2 from 88");
                while (buffer.hasRemaining()) {
                    channel.write(Charset.defaultCharset().encode(buffer));
                }
            }
            message = "";
        }

    }
}

}

этот код успешно работает в Java, но в Android он потребляет много памяти и работает ненадежно из-за цикла while (true), похожего на опрос, пожалуйста, дайте мне знать какое-нибудь решение, которое без опроса я могу читать и записывать данные.

Спасибо.

03.12.2014

Ответы:


1

Вам нужно compact() буфер после вызова decode() (или get(), или write(), всего, что берет данные из буфера).

Вы не должны выделять новый буфер каждый раз вокруг этого цикла while, и вы должны выйти из него, если read() вернет -1. На самом деле я вообще не вижу необходимости в цикле while.

04.12.2014
  • если я удалю цикл while, клиент мгновенно завершится. он не будет прослушивать любое полученное сообщение. 08.12.2014
  • Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..