![](/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.