Чтение данных из сокета - нет производительности
Я создаю сервис 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
это действительно не так сложно, как только вы привыкнете к этому:)