Чтение данных из сокета - нет производительности

Я создаю сервис Android, который всегда работает и прослушивания сообщений из сокета. Но это не работает с хорошей производительностью, и я ищу альтернативу или учебник nio.

Каков наилучший способ прослушивания сокета на все времена?

AndroidAsync поддерживает стандартные сокеты? https://github.com/koush/AndroidAsync

Кто-нибудь использовал Apache Mina? У меня проблемы с характером с Миной. http://mina.apache.org/

Или как я могу сделать эту работу с хорошей производительностью, используя стандартные сокеты

Жду вашего опыта.

Спасибо

2 ответа

Решение

Нормальный способ получить достойную производительность из сокета (для int read() а также write(int)) использовать буферизованный поток / читатель / писатель. Это уменьшает количество системных вызовов и значительно ускоряет ввод / вывод байтов или символов.

Я не ожидаю, что использование NIO будет иметь существенное значение. Если проблема не в буферизации, то (IMO) это, вероятно, проблема пропускной способности сети и / или задержки. Если это так, в Java мало что можно сделать, что могло бы иметь большое значение.

У меня есть несколько удобных методов для написания строк с java.nio:

private static Charset charset;
static
{
    charset = Charset.forName("UTF-8");
}

public static void writeString(SocketChannel sc, String string) throws IOException {
    CharBuffer c = CharBuffer.wrap(string);
    ByteBuffer b = charset.encode(c);
    b.compact();
    b.flip();
    sc.write(b);
}

public static String readString(SocketChannel sc) throws IOException {
    ByteBuffer bbuf = ByteBuffer.allocate(8096);
    sc.read(bbuf);
    bbuf.flip();
    CharBuffer cbuf = charset.decode(bbuf);
    return cbuf.toString();
}

Все, что вам нужно сделать, это установить свой SocketChannel соединения, и вы можете использовать их все, что вы хотите. java.nio это действительно не так сложно, как только вы привыкнете к этому:)

Другие вопросы по тегам