第三章 - 通道

3 - Socket通道

新的socket通道類能夠運行非阻塞模式而且是可選擇的。這兩個性能能夠激活大程序(如網絡服務器和中間件組件)巨大的可伸縮性和靈活性。本節中咱們會看到,再也沒有爲每一個socket鏈接使用一個線程的必要了,也避免了管理大量線程所需的上下文交換總開銷。藉助新的NIO類,一個或幾個線程就能夠管理成百上千的活動socket鏈接了而且只有不多甚至可能沒有性能損失。java

  • DatagramChannelSocketChannel:定義讀和寫功能的接口
  • ServerSocketChannel: 不實現讀和寫,負責監聽傳入的鏈接和建立新的SocketChannel對象,自己不傳輸數據

socket和socket通道之間的關係: 通道是一個鏈接I/O服務導管並提供與該服務交互的方法。就某個socket而言,它不會再次實現與之對應的socket通道類中的socket協議API,而java.net中已經存在的socket通道均可以被大多數協議操做重複使用服務器

DatagramChannel、SocketChannel和ServerSocketChannel在被實例化時都會建立一個對等socket對象。這些是咱們所熟悉的來自java.net的類(Socket、ServerSocket和DatagramSocket),它們已經被更新以識別通道。對等socket能夠經過調用socket( )方法從一個通道上獲取。此外,這三個java.net類如今都有getChannel( )方法。雖然每一個socket通道(在java.nio.channels包中)都有一個關聯的java.net socket對象,卻並不是全部的socket都有一個關聯的通道。若是您用傳統方式(直接實例化)建立了一個Socket對象,它就不會有關聯的SocketChannel而且它的getChannel( )方法將老是返回null。Socket通道委派協議操做給對等socket對象。若是在通道類中存在彷佛重複的socket方法,那麼將有某個新的或者不一樣的行爲同通道類上的這個方法相關聯。網絡

3.1 - 非阻塞

Socket通道能夠在非阻塞模式下運行。傳統Java socket的阻塞性質曾經是Java程序可伸縮性的最重要制約之一。非阻塞I/O是許多複雜的、高性能的程序構建的基礎。要把一個socket通道置於非阻塞模式,咱們要依靠全部socket通道類的公有超級類:SelectableChannel。socket

非阻塞I/O和可選擇性是緊密相連的,那也正是管理阻塞模式的API代碼要在SelectableChannel超級類中定義的緣由。性能

ServerSocketChannel serverChannel = ServerSocketChannel.open();
System.out.println("通道是不是阻塞模式: " + serverChannel.isBlocking());
 // 設置通道爲非阻塞 true: 阻塞
serverChannel.configureBlocking(false);
System.out.println("通道是不是阻塞模式: " + serverChannel.isBlocking());
通道是不是阻塞模式: true
通道是不是阻塞模式: false

3.2 - ServerSocketChannel

ServerSocketChannel是一個基於通道的socket監聽器。它同咱們所熟悉的java.net.ServerSocket執行相同的基本任務,不過它增長了通道語義,所以可以在非阻塞模式下運行.net

相關文章
相關標籤/搜索