第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java NIO 套接字通道僅在關(guān)閉輸出后發(fā)送數(shù)據(jù)。這是為什么呢?

Java NIO 套接字通道僅在關(guān)閉輸出后發(fā)送數(shù)據(jù)。這是為什么呢?

Helenr 2022-09-22 15:45:57
我正在嘗試編寫一個程序,該程序接受java nio套接字通道連接,但也使它們保持打開狀態(tài)。因此,假設(shè)客戶端發(fā)送了一條消息,那么服務(wù)器是否應(yīng)該立即發(fā)送相同的消息(簡單回顯服務(wù)器),但應(yīng)答過程不起作用。如果客戶端發(fā)送新消息,服務(wù)器將不會響應(yīng),直到我關(guān)閉客戶端的套接字通道。但是,在我關(guān)閉客戶端的頻道后,所有先前發(fā)送的消息將一次性進入。(抱歉我的英語不好,這不是我的母語)寫入過程用于服務(wù)器端和客戶端。寫作過程:try {    final ByteBuffer byteBuffer = ByteBuffer.wrap(data);    while(byteBuffer.hasRemaining()){        socketChannel.write(byteBuffer);    }    byteBuffer.flip();} catch (IOException exception) {    throw new BloumException(exception.getMessage());}閱讀過程:final ByteBuffer byteBuffer = ByteBuffer.allocate(DefaultConnectionCreator.this.getDefaultBufferSize());                    try {        while(socketChannel.read(byteBuffer) != -1){                //byteBuffer.clear();        }    } catch (IOException exception) {        exception.printStackTrace();        throw new BloumException(exception.getMessage());    }    return byteBuffer.array();關(guān)鍵選擇過程(自動關(guān)閉返回假):private void handleKeys(final ServerSocketChannel serverSocketChannel, Set<SelectionKey> keys, HashMap<SocketChannel, ByteBuilder> sessions) throws Exception{        final Iterator<SelectionKey> iterator = keys.iterator();        while(iterator.hasNext()){            final SelectionKey selectionKey = iterator.next();            iterator.remove();            if(selectionKey.isValid()){                if(selectionKey.isAcceptable()){                    final ServerSocketChannel serverSocketChannel2 = (ServerSocketChannel)selectionKey.channel();                    final SocketChannel socketChannel = serverSocketChannel2.accept();                    socketChannel.configureBlocking(false);                    socketChannel.register(selectionKey.selector(), SelectionKey.OP_READ);                    sessions.put(socketChannel, new ByteBuilder());                                        }        }    }
查看完整描述

1 回答

?
繁花如伊

TA貢獻2012條經(jīng)驗 獲得超12個贊

你好,你有很多錯誤

  1. 您需要在寫入之前翻轉(zhuǎn)緩沖區(qū)

  2. 如果讀取為 -1,則必須關(guān)閉通道

  3. 不要創(chuàng)建一個1GB字節(jié)的緩沖區(qū),使用的大小是256,1024,4096,8196我建議4096。

  4. 使用直接緩沖區(qū),直接內(nèi)存已被證明自己在I / O方面更快,因為它不會被垃圾回收器中斷

  5. 沒有布爾值的 if 語句將布爾值設(shè)置為等于該語句

  6. 沒有一個忽略讀取字節(jié)的while循環(huán),如果它是0,則表示您沒有任何要讀取的內(nèi)容,導(dǎo)致您循環(huán)直到套接字關(guān)閉

  7. 我很確定你在那里刪除0的循環(huán)是刪除沒有添加的數(shù)據(jù),但你可以這樣做,或者如果你翻轉(zhuǎn)緩沖區(qū),那么Arrays.copyOfRange(buffer.array(), 0, buffer.position())Arrays.copyOfRange(buffer.array(), 0, buffer limit())


查看完整回答
反對 回復(fù) 2022-09-22
  • 1 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號