溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java NIO代碼怎么寫(xiě)

發(fā)布時(shí)間:2022-01-14 20:12:33 來(lái)源:億速云 閱讀:185 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“Java NIO代碼怎么寫(xiě)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java NIO代碼怎么寫(xiě)”吧!

Java代碼:

import java.io.IOException;  import java.net.InetSocketAddress;  import java.net.ServerSocket;  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.util.Iterator;  import java.util.Set;   public class NIOServer {            /*標(biāo)識(shí)數(shù)字*/     private  int flag = 0;      /*緩沖區(qū)大小*/     private  int BLOCK = 4096;      /*接受數(shù)據(jù)緩沖區(qū)*/     private  ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);      /*發(fā)送數(shù)據(jù)緩沖區(qū)*/     private  ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);      private  Selector selector;       public NIOServer(int port) throws IOException {          // 打開(kāi)服務(wù)器套接字通道          ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();          // 服務(wù)器配置為非阻塞          serverSocketChannel.configureBlocking(false);          // 檢索與此通道關(guān)聯(lián)的服務(wù)器套接字          ServerSocket serverSocket = serverSocketChannel.socket();          // 進(jìn)行服務(wù)的綁定          serverSocket.bind(new InetSocketAddress(port));          // 通過(guò)open()方法找到Selector          selector = Selector.open();          // 注冊(cè)到selector,等待連接          serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);          System.out.println("Server Start----8888:");      }        // 監(jiān)聽(tīng)      private void listen() throws IOException {          while (true) {              // 選擇一組鍵,并且相應(yīng)的通道已經(jīng)打開(kāi)              selector.select();              // 返回此選擇器的已選擇鍵集。              Set<SelectionKey> selectionKeys = selector.selectedKeys();              Iterator<SelectionKey> iterator = selectionKeys.iterator();              while (iterator.hasNext()) {                          SelectionKey selectionKey = iterator.next();                  iterator.remove();                  handleKey(selectionKey);              }          }      }       // 處理請(qǐng)求      private void handleKey(SelectionKey selectionKey) throws IOException {          // 接受請(qǐng)求          ServerSocketChannel server = null;          SocketChannel client = null;          String receiveText;          String sendText;          int count=0;          // 測(cè)試此鍵的通道是否已準(zhǔn)備好接受新的套接字連接。          if (selectionKey.isAcceptable()) {              // 返回為之創(chuàng)建此鍵的通道。              server = (ServerSocketChannel) selectionKey.channel();              // 接受到此通道套接字的連接。              // 此方法返回的套接字通道(如果有)將處于阻塞模式。              client = server.accept();              // 配置為非阻塞              client.configureBlocking(false);              // 注冊(cè)到selector,等待連接              client.register(selector, SelectionKey.OP_READ);          } else if (selectionKey.isReadable()) {              // 返回為之創(chuàng)建此鍵的通道。              client = (SocketChannel) selectionKey.channel();              //將緩沖區(qū)清空以備下次讀取              receivebuffer.clear();              //讀取服務(wù)器發(fā)送來(lái)的數(shù)據(jù)到緩沖區(qū)中              count = client.read(receivebuffer);               if (count > 0) {                  receiveText = new String( receivebuffer.array(),0,count);                  System.out.println("服務(wù)器端接受客戶端數(shù)據(jù)--:"+receiveText);                  client.register(selector, SelectionKey.OP_WRITE);              }          } else if (selectionKey.isWritable()) {              //將緩沖區(qū)清空以備下次寫(xiě)入              sendbuffer.clear();              // 返回為之創(chuàng)建此鍵的通道。              client = (SocketChannel) selectionKey.channel();              sendText="message from server--" + flag++;              //向緩沖區(qū)中輸入數(shù)據(jù)              sendbuffer.put(sendText.getBytes());               //將緩沖區(qū)各標(biāo)志復(fù)位,因?yàn)橄蚶锩鎝ut了數(shù)據(jù)標(biāo)志被改變要想從中讀取數(shù)據(jù)發(fā)向服務(wù)器,就要復(fù)位              sendbuffer.flip();              //輸出到通道              client.write(sendbuffer);              System.out.println("服務(wù)器端向客戶端發(fā)送數(shù)據(jù)--:"+sendText);              client.register(selector, SelectionKey.OP_READ);          }      }       /**       * @param args       * @throws IOException       */     public static void main(String[] args) throws IOException {          // TODO Auto-generated method stub          int port = 8888;          NIOServer server = new NIOServer(port);          server.listen();      }  }

Java代碼:

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.SocketChannel;  import java.util.Iterator;  import java.util.Set;   public class NIOClient {       /*標(biāo)識(shí)數(shù)字*/     private static int flag = 0;      /*緩沖區(qū)大小*/     private static int BLOCK = 4096;      /*接受數(shù)據(jù)緩沖區(qū)*/     private static ByteBuffer sendbuffer = ByteBuffer.allocate(BLOCK);      /*發(fā)送數(shù)據(jù)緩沖區(qū)*/     private static ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);      /*服務(wù)器端地址*/     private final static InetSocketAddress SERVER_ADDRESS = new InetSocketAddress(              "localhost", 1111);       public static void main(String[] args) throws IOException {          // TODO Auto-generated method stub          // 打開(kāi)socket通道          SocketChannel socketChannel = SocketChannel.open();          // 設(shè)置為非阻塞方式          socketChannel.configureBlocking(false);          // 打開(kāi)選擇器          Selector selector = Selector.open();          // 注冊(cè)連接服務(wù)端socket動(dòng)作          socketChannel.register(selector, SelectionKey.OP_CONNECT);          // 連接          socketChannel.connect(SERVER_ADDRESS);          // 分配緩沖區(qū)大小內(nèi)存                    Set<SelectionKey> selectionKeys;          Iterator<SelectionKey> iterator;          SelectionKey selectionKey;          SocketChannel client;          String receiveText;          String sendText;          int count=0;           while (true) {              //選擇一組鍵,其相應(yīng)的通道已為 I/O 操作準(zhǔn)備就緒。              //此方法執(zhí)行處于阻塞模式的選擇操作。              selector.select();              //返回此選擇器的已選擇鍵集。              selectionKeys = selector.selectedKeys();              //System.out.println(selectionKeys.size());              iterator = selectionKeys.iterator();              while (iterator.hasNext()) {                  selectionKey = iterator.next();                  if (selectionKey.isConnectable()) {                      System.out.println("client connect");                      client = (SocketChannel) selectionKey.channel();                      // 判斷此通道上是否正在進(jìn)行連接操作。                      // 完成套接字通道的連接過(guò)程。                      if (client.isConnectionPending()) {                          client.finishConnect();                          System.out.println("完成連接!");                          sendbuffer.clear();                          sendbuffer.put("Hello,Server".getBytes());                          sendbuffer.flip();                          client.write(sendbuffer);                      }                      client.register(selector, SelectionKey.OP_READ);                  } else if (selectionKey.isReadable()) {                      client = (SocketChannel) selectionKey.channel();                      //將緩沖區(qū)清空以備下次讀取                      receivebuffer.clear();                      //讀取服務(wù)器發(fā)送來(lái)的數(shù)據(jù)到緩沖區(qū)中                      count=client.read(receivebuffer);                      if(count>0){                          receiveText = new String( receivebuffer.array(),0,count);                          System.out.println("客戶端接受服務(wù)器端數(shù)據(jù)--:"+receiveText);                          client.register(selector, SelectionKey.OP_WRITE);                      }                   } else if (selectionKey.isWritable()) {                      sendbuffer.clear();                      client = (SocketChannel) selectionKey.channel();                      sendText = "message from client--" + (flag++);                      sendbuffer.put(sendText.getBytes());                       //將緩沖區(qū)各標(biāo)志復(fù)位,因?yàn)橄蚶锩鎝ut了數(shù)據(jù)標(biāo)志被改變要想從中讀取數(shù)據(jù)發(fā)向服務(wù)器,就要復(fù)位                      sendbuffer.flip();                      client.write(sendbuffer);                      System.out.println("客戶端向服務(wù)器端發(fā)送數(shù)據(jù)--:"+sendText);                      client.register(selector, SelectionKey.OP_READ);                  }              }              selectionKeys.clear();          }      }  }

感謝各位的閱讀,以上就是“Java NIO代碼怎么寫(xiě)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java NIO代碼怎么寫(xiě)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI