日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

linux網絡配置命令 linux網絡配置的詳細過程( 三 )


2.3.1 I/O 多路復用- select

linux網絡配置命令 linux網絡配置的詳細過程


簡介:有連接請求抵達了再檢查處理 。
缺點:
  • 句柄上限- 默認打開的FD有限制,1024個 。
  • 重復初始化-每次調用 select(),需要把 fd 集合從用戶態(tài)拷貝到內核態(tài),內核進行遍歷 。
  • 逐個排查所有FD狀態(tài)效率不高 。
服務端的select 就像一塊布滿插口的插排,client端的連接連上其中一個插口,建立了一個通道,然后再在通道依次注冊讀寫事件 。一個就緒、讀或寫事件處理時一定記得刪除,要不下次還能處理 。
public static void main(String[] args) throws IOException {ServerSocketChannel ssc = ServerSocketChannel.open();//管道型ServerSocketssc.socket().bind(new InetSocketAddress(Constant.HOST, Constant.PORT));ssc.configureBlocking(false);//設置非阻塞System.out.println(" NIO single server started, listening on :" + ssc.getLocalAddress());Selector selector = Selector.open();ssc.register(selector, SelectionKey.OP_ACCEPT);//在建立好的管道上,注冊關心的事件 就緒while(true) {selector.select();Set<SelectionKey> keys = selector.selectedKeys();Iterator<SelectionKey> it = keys.iterator();while(it.hasNext()) {SelectionKey key = it.next();it.remove();//處理的事件,必須刪除handle(key);}}}private static void handle(SelectionKey key) throws IOException {if(key.isAcceptable()) {ServerSocketChannel ssc = (ServerSocketChannel) key.channel();SocketChannel sc = ssc.accept();sc.configureBlocking(false);//設置非阻塞sc.register(key.selector(), SelectionKey.OP_READ );//在建立好的管道上,注冊關心的事件 可讀} else if (key.isReadable()) { //flipSocketChannel sc = null;sc = (SocketChannel)key.channel();ByteBuffer buffer = ByteBuffer.allocate(512);buffer.clear();int len = sc.read(buffer);if(len != -1) {System.out.println("[" +Thread.currentThread().getName()+"] recv :"+ new String(buffer.array(), 0, len));}ByteBuffer bufferToWrite = ByteBuffer.wrap("HelloClient".getBytes());sc.write(bufferToWrite);}}2.3.2 I/O 多路復用 – poll
linux網絡配置命令 linux網絡配置的詳細過程


簡介:設計新的數據結構(鏈表)提供使用效率 。
poll和select相比在本質上變化不大,只是poll沒有了select方式的最大文件描述符數量的限制 。
缺點:逐個排查所有FD狀態(tài)效率不高 。
2.3.3 I/O 多路復用- epoll簡介:沒有fd個數限制,用戶態(tài)拷貝到內核態(tài)只需要一次,使用事件通知機制來觸發(fā) 。通過epoll_ctl注冊fd,一旦fd就緒就會通過callback回調機制來激活對應fd,進行相關的I/O操作 。
缺點:
  • 跨平臺,Linux 支持最好 。
  • 底層實現(xiàn)復雜 。
  • 同步 。
public static void main(String[] args) throws Exception {final AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(Constant.HOST, Constant.PORT));serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {@Overridepublic void completed(final AsynchronousSocketChannel client, Object attachment) {serverChannel.accept(null, this);ByteBuffer buffer = ByteBuffer.allocate(1024);client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer attachment) {attachment.flip();client.write(ByteBuffer.wrap("HelloClient".getBytes()));//業(yè)務邏輯}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {System.out.println(exc.getMessage());//失敗處理}});}@Overridepublic void failed(Throwable exc, Object attachment) {exc.printStackTrace();//失敗處理}});while (true) {//不while true main方法一瞬間結束}}當然上面的缺點相比較它優(yōu)點都可以忽略 。JDK提供了異步方式實現(xiàn),但在實際的Linux環(huán)境中底層還是epoll,只不過多了一層循環(huán),不算真正的異步非阻塞 。而且就像上圖中代碼調用,處理網絡連接的代碼和業(yè)務代碼解耦得不夠好 。Netty提供了簡潔、解耦、結構清晰的API 。

推薦閱讀