我正在創建一個始終運行並偵聽來自套接字的消息的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