面向流的偵聽套接字的可選通道。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了濱江免費建站歡迎大家使用!通過調(diào)用此類的open方法創(chuàng)建服務(wù)器套接字通道。?無法為任意預(yù)先存在的ServerSocket創(chuàng)建通道。?新創(chuàng)建的服務(wù)器套接字通道已打開但尚未綁定。?嘗試調(diào)用未綁定的服務(wù)器套接字通道的accept方法將導(dǎo)致拋出NotYetBoundException?。?可以通過調(diào)用此類定義的bind方法之一來綁定服務(wù)器套接字通道。
accept
public abstract?SocketChannel?accept() throws?IOException
接受與此通道套接字的連接。
如果此通道處于非阻塞模式,則如果沒有掛起連接,則此方法將立即返回null
。?否則它將無限期地阻塞,直到新連接可用或發(fā)生I / O錯誤。
無論此通道的阻塞模式如何,此方法返回的套接字通道(如果有)都將處于阻塞模式。
serverSocket.bind()方法將ServerSocket類綁定到指定的地址,而ServerSocketChannel類也有bind() 方法,該方法public final ServerSocketChannel bind(SocketAddress local)的作用是將通道的套接字綁定到本地地址并偵聽連接。
public abstract ServerSocketChannel bind(SocketAddress local; int backlog)
方法的作用是將通道的套接字綁定到本地地址并偵聽連接,通過使用參數(shù)backlog來限制客戶端連接的數(shù)量。
public abstract Socket Channel accept()方法的作用是接受此通道套接字的連接。如果此通道處于非阻塞模式,那么在不存在掛起的連接時,此方法將直接返回nul否則,在新的連接可用或者發(fā)生I/O錯誤之前會無限期地阻塞它。無論此通道的阻塞模式如何,此方法返回的套接字通道(如果有)將處于阻塞模式。
調(diào)用 ServerSocketChannel的 public final Selectable Channel configure Blocking( boolean block)方法即可。 public final Selectable Channel configure Blocking( boolean block)方法的作用是調(diào)整此通道的阻塞模式,傳入tue是阻塞模式,傳人 false是非阻塞模式。
可以把這個 Socketchannel通道注冊到選擇器中實現(xiàn)I/O多路復(fù)用,另外, Socketchannel通道使用緩沖區(qū)進行數(shù)據(jù)的讀取操作。
返回此通道所支持的操作
public final int validOps()
方法的作用是返回一個操作集,標識此通道所支持的操作。因為服務(wù)器套接字通道僅支持接受新的連接,所以此方法返回?SelectionKey. OP ACCEPT
。
SocketChannel支持OP_CONNECT、OP_READ、OP_WRITE。
bind
public abstract?ServerSocketChannel?bind?(SocketAddress?local, int?backlog) throws?IOException
將通道的套接字綁定到本地地址并配置套接字以偵聽連接。
此方法用于在套接字和本地地址之間建立關(guān)聯(lián)。?一旦建立關(guān)聯(lián),則套接字保持綁定直到通道關(guān)閉。
backlog
參數(shù)是套接字上的大掛起連接數(shù)。?它的確切語義是特定于實現(xiàn)的。?特別地,實現(xiàn)可以施加大長度或者可以選擇忽略參數(shù)altogther。?如果backlog
參數(shù)的值為0
或負值,則使用特定于實現(xiàn)的默認值。
由于Selector類是抽象類,需要調(diào)用 open方法獲得 Selector對象。
Selector類的public static Selector open
方法的作用是打開1個選擇器,使 Selectablechannel能將自身注冊到這個選擇器上。
執(zhí)行注冊操作與獲得SelectionKey對象
Selectable Channel類的public final SelectionKey register( Selector sel, Int ops)方法的作用是向給定的選擇器注冊此通道,返回一個選擇鍵( SelectionKey)。
參數(shù)sel代表要向其注冊此通道的選擇器,參數(shù)ops代表 register方法的返回值 SelectionKey的可用操作集,操作集是在 SelectionKey類中以常量的形式進行提供的:
OP_ACCEPT:用于套接字接受操作的操作集位
OP_CONNECT:用于套接字連接操作的操作集位
OP_READ:用于讀取操作的操作集位
OP_WRITE:用于寫入操作的操作集位
如果想把通道注冊到選擇器中,就必須將通道設(shè)置成非阻塞模式。
Tomcat的Poller對象Poller(輪訓(xùn)器):實現(xiàn)Runnable接口,構(gòu)造函數(shù)為this.selector = Selector.open();由一個SynchronizedQueue構(gòu)成
Tomcat的Acceptor對象實現(xiàn)了runable接口
Acceptor跑在一個單獨的線程里,它在一個死循環(huán)里調(diào)用 accept方法來接收新連接,一旦有新的連接請求到來,accept方法返回一個 Channel 對象,接著把 Channel對象交給 Poller 去處理。
Poller 的本質(zhì)是一個 Selector,也跑在單獨線程里。Poller在內(nèi)部維護一個 Channel數(shù)組,它在一個死循環(huán)里不斷檢測 Channel的數(shù)據(jù)就緒狀態(tài),一旦有 Channel可讀,就生成一個 SocketProcessor任務(wù)對象扔給 Executor去處理。
Tomcat Connector總結(jié)1、一個connector組件 可分為 protocolHandler 和 Adapter ,protocolHandler 用于處理 網(wǎng)絡(luò)請求 , Adapter 將內(nèi)部request , response 適配成 servlet的HttpServletReqeust , HttpServiceResponse
2、protocolHandler主要處理 網(wǎng)絡(luò)連接 和 應(yīng)用層協(xié)議 ,包含了兩個重要部件 EndPoint 和 Processor, EndPoint 是用來實現(xiàn) TCP/IP 協(xié)議數(shù)據(jù)讀寫的,本質(zhì)調(diào)用操作系統(tǒng)的 socket 接口 , Processor用于處理socket, 轉(zhuǎn)換應(yīng)用層協(xié)議 ,封裝內(nèi)部 request 和 response
3、adapter 用于 內(nèi)部 request 和 response 轉(zhuǎn)換 成sevlet 規(guī)范的 HttpServletReqeust , HttpServiceResponse
4、EndPoint 一圖以避之
5、
Processor 用來實現(xiàn) HTTP 協(xié)議,Processor 接收來自 EndPoint 的 Socket,讀取字節(jié)流解析成 Tomcat Request 和 Response 對象,并通過 Adapter 將其提交到容器處理,Processor 是對應(yīng)用層協(xié)議的抽象
參考:tomcat的原理-組件connector - 簡書
Tomcat - Request請求處理過程:Connector | Java 全棧知識體系
一個web請求訪問tomcat會經(jīng)過如下組件:
主要看其對Tomcat的設(shè)置。有大線程數(shù)和大連接數(shù)。
并發(fā)量指連接數(shù)還是線程數(shù)?連接數(shù)!
200個線程如何處理10000條連接??
Tomcat有兩種處理連接的模式,一種是BIO,一個線程只處理一個Socket連接,另一種就是NIO,一個線程處理多個Socket連接。由于HTTP請求不會太耗時,而且多個連接一般不會同時來消息,所以一個線程處理多個連接沒有太大問題。
為什么不開幾個線程?
多開線程的代價就是,增加上下文切換的時間,浪費CPU時間,另外還有就是線程數(shù)增多,每個線程分配到的時間片就變少。多開線程≠提高處理效率。
那增大大連接數(shù)呢?
增大大連接數(shù),支持的并發(fā)量確實可以上去。但是在沒有改變硬件條件的情況下,這種并發(fā)量的提升必定以犧牲響應(yīng)時間為代價。
tomcat7以下的版本都是BIO,就是一個請求是一個獨立的線程。不能適用高并發(fā)的場景。
在8以上的版本,默認都是NIO。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧