国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

jdk7:淺談 AIO NIO2.0

wanghui / 634人閱讀

摘要:一概述在引入同步非阻塞包之后,終于在版本加入了異步的。注意,無論用還是,這里的調(diào)用都是非阻塞的立即返回。不過,由于朝鮮還沒有研發(fā)出能夠重返大氣層的運(yùn)載火箭,所以大浦洞號(hào)尚不具備搭載彈頭的攻擊能力。

一、概述

JDK在1.4引入NIO(同步非阻塞)包之后,終于在1.7版本加入了異步IO的AIO。
同步異步阻塞和非阻塞等概念,建議參考 《Unix網(wǎng)絡(luò)編程》 卷1. ,這里只談AIO的api。

二、主要的類

AsynchronousSocketChannel

AsynchronousServerSocketChannel

AsynchronousFileChannel

AsynchronousDatagramChannel

三、通過aio實(shí)現(xiàn)server

先看下AsynchronousServerSocketChannel,它有兩個(gè)構(gòu)造方法,選擇哪個(gè)構(gòu)造方法,也就選擇了不同的編程模型,分別是Future機(jī)制和Handler回調(diào)機(jī)制。Future機(jī)制適合需要同步等待獲取結(jié)果的,Handler機(jī)制則看上去則更像純異步。當(dāng)然,結(jié)果都是一樣的,看自己需要或者喜歡哪個(gè)模型吧。

public abstract Future accept();

public abstract  void accept(A attachment,
                                    CompletionHandler handler);

先看看AsynchronousServerSocketChannel來啟動(dòng)一個(gè)server,代碼如下。注意accept,無論用future還是handler,這里的調(diào)用都是非阻塞的立即返回。這里選用handler的方式,如果有客戶端連接上來,handler的會(huì)被回調(diào)。

public class AioServer {
    
    public final int port = 8080;
    public final int backlog = 2; //跟bio和nio的backlog其實(shí)是一樣的。指定accpet等待隊(duì)列的長(zhǎng)度
    private AioAcceptHandler acceptHandler;
    private AsynchronousServerSocketChannel serverSocket;
    
    public static void main(String[] args) throws Exception {
        new AioServer().startup();
    }

    private void startup() throws Exception {
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        ExecutorService channelWorkers = Executors.newFixedThreadPool(availableProcessors * 2);
        AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withCachedThreadPool(channelWorkers , 1);
        serverSocket = AsynchronousServerSocketChannel.open(channelGroup);
        serverSocket.bind(new InetSocketAddress(port), backlog);
        acceptHandler = new AioAcceptHandler();
        accept();
    }

    public void accept() {
        serverSocket.accept(this, acceptHandler); //非阻塞
    }
}

接下來CompletionHandler的接口吧,代碼如下。看到泛型的 V result 就說嘛,當(dāng)我們使用CompletionHandler的時(shí)候,自己需要清楚的知道返回結(jié)果是什么。
比如accept中指定的CompletionHandler。它是處理接受連接的,成功返回的話,結(jié)果就是套接字,那么我們就要指定泛型V的實(shí)際類型為AsynchronousSocketChannel。
再比如read方法中指定CompletionHandler。read是將數(shù)據(jù)讀取到ByteBuffer,而回調(diào)CompletionHandler的時(shí)候,結(jié)果V是讀取的數(shù)量。所以我們就要指定泛型V的實(shí)際類型為Integer。
具體可以看下面的實(shí)現(xiàn)代碼 AioAcceptHandler 和 AioReadHandler。

public interface CompletionHandler {
    //調(diào)用結(jié)果,附件
    void completed(V result, A attachment);
    //異常對(duì)象、附件
    void failed(Throwable exc, A attachment);
}

AioAcceptHandler

public class AioAcceptHandler implements CompletionHandler{

    public void completed(AsynchronousSocketChannel socket, AioServer aioServer) {
        try {
            System.out.printf("客戶端%s連接成功.
", socket.getRemoteAddress().toString());
            readData(socket);
        } catch (Exception e) {
            e.printStackTrace();
            try {
                socket.close();
            } catch (IOException e1) {}
        } finally {
            aioServer.accept();
        }
    }

    private void readData(AsynchronousSocketChannel socket) {
        ByteBuffer buf = ByteBuffer.allocate(32);   //測(cè)試時(shí),可以不設(shè)置太大,觀察aio的多次read
        socket.read(buf, buf, new AioReadHandler(socket));
    }

    public void failed(Throwable exc, AioServer aioServer) {
        exc.printStackTrace();
    }
}

AioReadHandler

public class AioReadHandler implements CompletionHandler {

    private AsynchronousSocketChannel socket;
    private ByteArrayOutputStream baos = new ByteArrayOutputStream();
    public AioReadHandler(AsynchronousSocketChannel socket){
        this.socket = socket;
    }
    
    public void completed(Integer result, ByteBuffer buf) {
        System.out.println("result = " + result + " buf = " + buf);
        if (result > 0) {
            buf.flip();
            try {
                baos.write(buf.array()); 
            } catch (IOException e) {
                e.printStackTrace();
            }
            buf.clear();
            socket.read(buf, buf, this);
        } else if (result == -1) { //result為-1的時(shí)候,客戶端的socket已經(jīng)正常關(guān)閉。
            try {
                System.out.printf("客戶端%s已經(jīng)斷開.
", socket.getRemoteAddress().toString());
                String info = new String(baos.toByteArray(), Charset.forName("UTF8"));
                System.out.println(info);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                buf = null;
                try {
                    socket.close();
                } catch (IOException e) {}
            }
        }
    }

    public void failed(Throwable exc, ByteBuffer buf) {
        exc.printStackTrace();
    }
}

基本上,一個(gè)簡(jiǎn)單的AIOServer就上面這點(diǎn)代碼拉。實(shí)際上我感覺代碼比NIO用Selector的方式還是簡(jiǎn)單清晰多了。至于aio的原理,實(shí)際上就是去看看epoll等資料就知道了。

這里附上一個(gè)測(cè)試的客戶端代碼:

public class BioClient {
    public static void main(String[] args) throws Exception {
        String txt = "美國(guó)在發(fā)布的朝鮮軍力評(píng)估報(bào)告中也認(rèn)為:“朝鮮發(fā)展航天運(yùn)載工具對(duì)開發(fā)射程可達(dá)美國(guó)的遠(yuǎn)程導(dǎo)彈意義重要,射程也許能覆蓋美國(guó)部分地區(qū)。不過,由于朝鮮還沒有研發(fā)出能夠重返大氣層的運(yùn)載火箭,所以‘大浦洞2號(hào)’尚不具備搭載彈頭的攻擊能力。”";
        Socket socket = new Socket("localhost", 8080);
        PrintStream print = new PrintStream(socket.getOutputStream());
        print.print(txt);
        print.close();
        socket.close();
        System.out.println("ok.");
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65706.html

相關(guān)文章

  • java中的AIO

    摘要:會(huì)關(guān)聯(lián)線程池,它的任務(wù)是接收處理事件,并分發(fā)給負(fù)責(zé)處理通道中操作結(jié)果的結(jié)果處理器。跟通道中發(fā)起的操作關(guān)聯(lián)的結(jié)果處理器確保是由線程池中的某個(gè)線程產(chǎn)生。基本思想是主線程會(huì)派一個(gè)偵查員到獨(dú)立的線程中執(zhí)行操作。 簡(jiǎn)介 jdk7中新增了一些與文件(網(wǎng)絡(luò))I/O相關(guān)的一些api。這些API被稱為NIO.2,或稱為AIO(Asynchronous I/O)。AIO最大的一個(gè)特性就是異步能力,這種能力...

    鄒強(qiáng) 評(píng)論0 收藏0
  • Netty序章之BIO NIO AIO演變

    摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司...

    VincentFF 評(píng)論0 收藏0
  • Netty序章之BIO NIO AIO演變

    摘要:后改良為用線程池的方式代替新增線程,被稱為偽異步。最大的問題是阻塞,同步。每次請(qǐng)求都由程序執(zhí)行并返回,這是同步的缺陷。這些都會(huì)被注冊(cè)在多路復(fù)用器上。多路復(fù)用器提供選擇已經(jīng)就緒狀態(tài)任務(wù)的能力。并沒有采用的多路復(fù)用器,而是使用異步通道的概念。 Netty是一個(gè)提供異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,用以快速開發(fā)高性能、高可靠的網(wǎng)絡(luò)服務(wù)器和客戶端程序。Netty簡(jiǎn)化了網(wǎng)絡(luò)程序的開發(fā),是很多框架和公司...

    CntChen 評(píng)論0 收藏0
  • Java NIO淺析

    摘要:阻塞請(qǐng)求結(jié)果返回之前,當(dāng)前線程被掛起。也就是說在異步中,不會(huì)對(duì)用戶線程產(chǎn)生任何阻塞。當(dāng)前線程在拿到此次請(qǐng)求結(jié)果的過程中,可以做其它事情。事實(shí)上,可以只用一個(gè)線程處理所有的通道。 準(zhǔn)備知識(shí) 同步、異步、阻塞、非阻塞 同步和異步說的是服務(wù)端消息的通知機(jī)制,阻塞和非阻塞說的是客戶端線程的狀態(tài)。已客戶端一次網(wǎng)絡(luò)請(qǐng)求為例做簡(jiǎn)單說明: 同步同步是指一次請(qǐng)求沒有得到結(jié)果之前就不返回。 異步請(qǐng)求不會(huì)...

    yeooo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wanghui

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<