我正在创建一个始终运行并侦听来自套接字的消息的android服务。但它不能很好地工作,我正在寻找一些nio替代品或教程。从套接字读取数据 - 没有性能
什么是全天候收听套接字的最佳方式?
AndroidAsync是否支持标准套接字? https://github.com/koush/AndroidAsync
有没有人使用Apache Mina?我与米娜有性格问题。 http://mina.apache.org/
或如何做这项工作,用良好的业绩非标准插座
等待您的经验。
感谢
我正在创建一个始终运行并侦听来自套接字的消息的android服务。但它不能很好地工作,我正在寻找一些nio替代品或教程。从套接字读取数据 - 没有性能
什么是全天候收听套接字的最佳方式?
AndroidAsync是否支持标准套接字? https://github.com/koush/AndroidAsync
有没有人使用Apache Mina?我与米娜有性格问题。 http://mina.apache.org/
或如何做这项工作,用良好的业绩非标准插座
等待您的经验。
感谢
正常的方式来获得一个体面的插座性能(int read()
和write(int)
)是使用缓冲流/读/写器。这减少了系统调用的次数,并且使I/O在一次I/O时更快。
我不指望使用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
真是没那么难过,一旦你习惯了:)
为什么你的缓冲区大小是8096?为什么你忽略流结束? – EJP
我只是坚持一个任意数字在那里,它为我的目的工作。请解释流的结束? – Logan