我正在寻找有关Java中非阻塞套接字写入的建议。我的代码只需要将一些数据写入套接字并完全忘记它。我不关心响应或数据实际消耗的时间。最好的方法是什么?
答案 0 :(得分:1)
当你遇到这样的复杂问题时,最好的想法是使用像KryoNet这样的网络库(更复杂,更多功能)或PryoNet(更简单,更少功能),它们都支持简单的异步I / O over socket。如果你真的想要,你可以分开来理解它们是如何工作的。请注意,Socket
上的写入仅在发送缓冲区已满时才会阻止。
如果你没有采用这种方法,为了处理这种没有线程同步的简单情况,你需要使用Selectors
和Channels
,因为如果一个套接字没有繁忙的循环,就无法轻易确定在基本Socket
类中没有缓冲区填充级别通知机制的任何时间点都是“可写”的。你也可以在一个线程中使用套接字,然后它可以无限制地阻塞而没有问题,但是你可能会遇到一些同步问题。
答案 1 :(得分:1)
听起来像是在异步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异步套接字非常易于使用。
答案 2 :(得分:0)
创建一个发布这些事件的线程,它将运行它的背景并将数据提交给服务器。
答案 3 :(得分:0)
您可以使用Java NIO的选择器和通道(复杂) - 或者您可以尝试更友好的网络库,如Apache MINA,它支持非阻塞I / O.