繁体   English   中英

Java非阻塞套接字写

[英]Java non-blocking socket write

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

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

如果不采用这种方法,要处理这种没有线程同步的简单情况,你需要使用SelectorsChannels ,因为如果套接字在任何时间点都是“可写”的,没有繁忙的循环就无法轻易确定基本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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM