Java非阻塞套接字写

时间:2012-06-13 19:06:11

标签: java nio

我正在寻找有关Java中非阻塞套接字写入的建议。我的代码只需要将一些数据写入套接字并完全忘记它。我不关心响应或数据实际消耗的时间。最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

当你遇到这样的复杂问题时,最好的想法是使用像KryoNet这样的网络库(更复杂,更多功能)或PryoNet(更简单,更少功能),它们都支持简单的异步I / O over socket。如果你真的想要,你可以分开来理解它们是如何工作的。请注意,Socket上的写入仅在发送缓冲区已满时才会阻止。

如果你没有采用这种方法,为了处理这种没有线程同步的简单情况,你需要使用SelectorsChannels,因为如果一个套接字没有繁忙的循环,就无法轻易确定在基本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.