国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

netty(二):NIO——處理可寫事件

這篇具有很好參考價值的文章主要介紹了netty(二):NIO——處理可寫事件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

處理可寫事件

什么情況下需要注冊可寫事件?

  • 在服務(wù)端一次性無法把數(shù)據(jù)發(fā)送完的情況下,需要注冊可寫事件
    • 服務(wù)端一次性是否能夠把數(shù)據(jù)全部發(fā)送完成取決于服務(wù)端的緩沖區(qū)大小,該緩沖區(qū)不受程序控制

注冊可寫事件的步驟

  • 判斷ByteBuffer是否仍有剩余,如果有剩余注冊可寫事件

    ByteBuffer bf = "hello client,welcome";
    SocketChannel sc = (SocketChannel) selectionKey.channel();
    sc.write(bf);
    if(bf.hasRemaining){
        selectionKey.interestOps(SelectionKey.OP_READ + SelectionKey.OP_WRITE);
        selectionKey.attachment(bf);
    }
    
  • 監(jiān)聽可寫事件,判斷數(shù)據(jù)是否寫完,數(shù)據(jù)寫完需要

    if (key.isWritable()){
        // 監(jiān)聽可寫事件
        SocketChannel channel = (SocketChannel) key.channel();
        ByteBuffer byteBuffer = (ByteBuffer) key.attachment();
        channel.write(byteBuffer);
        if (!byteBuffer.hasRemaining()) {
            // 判斷數(shù)據(jù)是否寫完
            // 數(shù)據(jù)寫完,解除對buffer的引用
            key.attach(null);
            // 數(shù)據(jù)寫完,不再關(guān)注可寫事件
            key.interestOps(key.interestOps() - SelectionKey.OP_WRITE);
        }
    }
    

代碼示例

  • 客戶端

    package com.ysf;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    
    public class Client {
    
        public static void main(String[] args) throws IOException {
            SocketChannel sc = SocketChannel.open();
            sc.connect(new InetSocketAddress("127.0.0.1",11027));
            sc.write(Charset.defaultCharset().encode("123456\n223456\nhello server\n"));
            while (true){
                ByteBuffer allocate = ByteBuffer.allocate(16);
                sc.read(allocate);
                allocate.flip();
                System.out.println(Charset.defaultCharset().decode(allocate));
            }
        }
    }
    
  • 服務(wù)端文章來源地址http://www.zghlxwxcb.cn/news/detail-673294.html

    package com.ysf;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class WriterSelectorServer {
    
        public static void handleContent(ByteBuffer byteBuffer){
            byteBuffer.flip();
            for (int i = 0;i < byteBuffer.limit();i++){
                if (byteBuffer.get(i) == '\n'){
                    int length = i + 1 - byteBuffer.position();
                    ByteBuffer allocate = ByteBuffer.allocate(length);
                    for (int j = 0;j<length;j++){
                        allocate.put(byteBuffer.get());
                    }
                    allocate.flip();
                    System.out.println(Charset.defaultCharset().decode(allocate));
                }
            }
            byteBuffer.compact();
        }
    
        public static void main(String[] args) throws IOException {
            Selector selector = Selector.open();
    
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.configureBlocking(false);
            ssc.bind(new InetSocketAddress(11027));
            SelectionKey sscKey = ssc.register(selector, 0, null);
            sscKey.interestOps(SelectionKey.OP_ACCEPT);
    
            while (true){
                selector.select();
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()){
                    SelectionKey key = iterator.next();
                    iterator.remove();
                    if (key.isAcceptable()){
                        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
                        SocketChannel sc = serverSocketChannel.accept();
                        sc.configureBlocking(false);
                        ByteBuffer welcome = Charset.defaultCharset().encode("welcome");
                        sc.write(welcome);
                        Map<String,ByteBuffer> attach = new HashMap<>();
                        ByteBuffer readBuffer = ByteBuffer.allocate(16);
                        attach.put("read",readBuffer);
                        SelectionKey scKey = sc.register(selector, 0, attach);
                        if (welcome.hasRemaining()){
                            attach.put("write",welcome);
                            scKey.interestOps(SelectionKey.OP_READ + SelectionKey.OP_WRITE);
                        }else {
                            scKey.interestOps(SelectionKey.OP_READ);
                        }
                    }else if (key.isReadable()){
                        SocketChannel channel = (SocketChannel) key.channel();
                        Map<String, ByteBuffer> attachment = ((Map<String,ByteBuffer>) key.attachment());
                        ByteBuffer readBuffer = attachment.get("read");
                        int read;
                        try {
                            read = channel.read(readBuffer);
                        } catch (IOException e) {
                            e.printStackTrace();
                            key.cancel();
                            continue;
                        }
                        if (read == -1){
                            key.cancel();
                        }else {
                            handleContent(readBuffer);
                            if (readBuffer.position() == readBuffer.limit()){
                                ByteBuffer newAttachment = ByteBuffer.allocate(readBuffer.capacity() * 2);
                                readBuffer.flip();
                                newAttachment.put(readBuffer);
                                attachment.put("read",newAttachment);
                            }
                        }
                    }else if (key.isWritable()){
                        SocketChannel channel = (SocketChannel) key.channel();
                        Map<String, ByteBuffer> attachment = (Map<String, ByteBuffer>) key.attachment();
                        ByteBuffer byteBuffer = attachment.get("write");
                        channel.write(byteBuffer);
                        if (!byteBuffer.hasRemaining()) {
                            attachment.remove("write");
                            key.interestOps(key.interestOps() - SelectionKey.OP_WRITE);
                        }
                    }
                }
            }
        }
    }
    
    

到了這里,關(guān)于netty(二):NIO——處理可寫事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java網(wǎng)絡(luò)編程(二)NIO和Netty實現(xiàn)多人聊天功能
  • 快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    快速入門Java NIO(Not I/O)的網(wǎng)絡(luò)通信框架--Netty

    了解netty前需要對nio有一定認(rèn)識,該筆記基礎(chǔ)來自bilinbili黑馬,在此基礎(chǔ)上自己學(xué)習(xí)的筆記,添加了一些自己的理解 了解java 非阻塞io編程 1.1 Netty 是什么? Netty 是一個異步(基于多線程)的、基于事件驅(qū)動(多路復(fù)用的那寫事件驅(qū)動)的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護(hù)、高性能的

    2024年01月17日
    瀏覽(25)
  • 【netty基礎(chǔ)四】netty與nio

    【netty基礎(chǔ)四】netty與nio

    阻塞I/O在調(diào)用InputStream.read()方法時是 阻塞的,它會一直等到數(shù)據(jù)到來 (或超時)時才會返回; 同樣,在調(diào)用ServerSocket.accept()方法時,也會一直 阻塞到有客戶端連接 才會返回,每個客戶端連接成功后,服務(wù)端都會啟動一個線程去處理該客戶端的請求。 阻塞I/O的通信模型示意

    2024年02月10日
    瀏覽(21)
  • 聊聊分布式架構(gòu)06——[NIO入門]簡單的Netty NIO示例

    聊聊分布式架構(gòu)06——[NIO入門]簡單的Netty NIO示例

    目錄 Java NIO和Netty NIO比較 Java NIO: Netty: Netty NIO中的主要模塊 Transport(傳輸層) Buffer(緩沖區(qū)) Codec(編解碼器) Handler(處理器) EventLoop(事件循環(huán)) Bootstrap和Channel(引導(dǎo)和通道) Future和Promise(異步編程) Netty示例 服務(wù)端時序圖 服務(wù)端代碼 客戶端時序圖 客戶端代碼

    2024年02月07日
    瀏覽(55)
  • Netty開篇——NIO章下(五)

    Netty開篇——NIO章下(五)

    SelectionKey 表示 Selector 和網(wǎng)絡(luò)通道的注冊關(guān)系,共四種(全是常量): Int?OP_ACCEPT:有新的網(wǎng)絡(luò)連接可以接受,值為 16?(1 4) Int?OP_CONNECT: 代表連接已經(jīng)建立,值為 8?(1 3) Int?OP_READ:代表讀操作,值為 1?(1 0) Int?OP_WRITE: 代表寫操作,值為 4??(1 2) 相關(guān)方法: ? ServerSocket

    2024年01月20日
    瀏覽(21)
  • Netty開篇——NIO章上(三)

    Netty開篇——NIO章上(三)

    Java NIO基本介紹 java non-blocking?I/O?稱為NIO(也叫New?IO)。JDK4開始提供,同步非阻塞 相關(guān)內(nèi)容在?java.nio 包及子包下,對java.io 包中的很多類進(jìn)行改寫。 三大核心: Channel(通道),Buffer(緩沖區(qū)),Selector(選擇器) NIO是 面向緩沖區(qū)或者面向塊 編程 的 。數(shù)據(jù)讀取到一個它后處理的緩沖區(qū),

    2024年01月16日
    瀏覽(17)
  • NIO和netty的常用類

    給ServerBootstrap配置兩個EventLoopGroup,一個建立連接,一個處理網(wǎng)絡(luò)io。 EventLoopGroup給EventLoop分配線程。 在 Netty 中,EventLoop 通過不斷輪詢 Selector 來檢測 Channel 上發(fā)生的事件,當(dāng) Channel 上的事件到達(dá)時,EventLoop 會將事件傳入 相應(yīng)的Channel 的成員變量 ChannelPipeline 中,經(jīng)過所有C

    2024年01月25日
    瀏覽(19)
  • Netty和傳統(tǒng)NIO之間的比較

    Netty回顯服務(wù)器實現(xiàn): 上述代碼是一個使用Netty實現(xiàn)的回顯服務(wù)器。讓我們逐行解釋代碼的實現(xiàn): 首先,我們創(chuàng)建了兩個 NioEventLoopGroup ,一個用于接收客戶端連接(bossGroup),另一個用于處理客戶端連接上的請求(workerGroup)。 然后,我們創(chuàng)建一個 ServerBootstrap 實例,并配置

    2024年01月16日
    瀏覽(25)
  • Netty Review - NIO空輪詢及Netty的解決方案源碼分析

    Netty Review - NIO空輪詢及Netty的解決方案源碼分析

    Netty Review - ServerBootstrap源碼解析 Netty Review - NioServerSocketChannel源碼分析 Netty Review - 服務(wù)端channel注冊流程源碼解析 NIO空輪詢(Empty Polling)是指在使用Java NIO 時,當(dāng)Selector上注冊的Channel沒有就緒事件時,Selector.select()方法會返回0,但該方法會導(dǎo)致CPU空轉(zhuǎn),因為它會不斷地調(diào)用操

    2024年02月21日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包