簡體   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