0

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

4

4 回答 4

1

当你遇到这样的复杂性时,最好的主意是使用像KryoNet(更复杂,更多功能)或PryoNet(更简单,更少功能)这样的网络库,它们都支持简单的基于套接字的异步 I/O。如果你真的想的话,你可以把它们分开来了解它们是如何工作的。Socket请注意,只有在发送缓冲区已满时才会阻止对 a 的写入。

如果您不采取这条路线,要在没有线程同步的情况下处理这个简单的情况,您需要使用Selectorsand Channels,因为如果套接字在没有缓冲区填充的任何时间点是“可写”的,那么如果没有繁忙的循环,就无法轻松确定基础Socket类中的级别通知机制。您也可以在线程中使用套接字,然后它可以无限期地阻塞而不会出现问题,但是您可能会遇到一些同步问题。

于 2012-06-13T19:08:57.817 回答
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 异步套接字非常容易使用。

于 2012-06-14T01:54:02.640 回答
0

您可以使用 Java NIO(复杂)中的选择器和通道 - 或者您可以尝试更友好的网络库,例如支持非阻塞 I/O 的Apache MINA 。

于 2012-06-13T19:20:21.373 回答
0

创建一个将这些事件发布到的线程,它将在后台运行并将数据提交到服务器。

于 2012-06-13T19:10:17.127 回答