![](/img/trans.png)
[英]What is the difference between a blocking socket write and a non-blocking socket write in Java?
[英]Java non-blocking socket write
我正在尋找Java中非阻塞套接字寫入的建議。 我的代碼只需要將一些數據寫入套接字並完全忘記它。 我不關心響應或數據實際消耗的時間。 最好的方法是什么?
當您遇到這樣的復雜問題時,最好的想法是使用像KryoNet這樣的網絡庫(更復雜,更多功能)或PryoNet (不太復雜,功能較少),它們都支持簡單的套接字異步I / O. 如果你真的想要,你可以分開來理解它們是如何工作的。 請注意,如果發送緩沖區已滿,則Socket
上的寫入僅會阻塞。
如果不采用這種方法,要處理這種沒有線程同步的簡單情況,你需要使用Selectors
和Channels
,因為如果套接字在任何時間點都是“可寫”的,沒有繁忙的循環就無法輕易確定基本Socket
類中的緩沖區填充級別通知機制。 你也可以在一個線程中使用套接字,然后它可以無限制地阻塞而沒有問題,但是你可能會遇到一些同步問題。
聽起來像是在異步I / O之后。 這是一個簡短的例子:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class Test
{
public static void main(String[] args)
{
final AsynchronousSocketChannel out = AsynchronousSocketChannel.open();
out.connect(new InetSocketAddress("www.google.com", 80), null,
new CompletionHandler<Void, Void>()
{
@Override
public void completed(Void result, Void attachment)
{
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.asCharBuffer().put("GET /index.html HTTP/1.1");
out.write(buffer, null, new CompletionHandler<Integer, Void>()
{
@Override
public void completed(Integer result, Void attachment)
{
// ignore the result
}
@Override
public void failed(Throwable t, Void attachment)
{
t.printStackTrace();
}
});
}
@Override
public void failed(Throwable t, Void attachment)
{
t.printStackTrace();
}
});
}
}
你不需要任何花哨的框架。 Java7異步套接字非常容易使用。
創建一個發布這些事件的線程,它將運行它的后台並將數據提交給服務器。
您可以使用Java NIO的選擇器和通道(復雜) - 或者您可以嘗試更友好的網絡庫,如Apache MINA ,它支持非阻塞I / O.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.