socket編程的阻塞模式效率低下,但卻是Java中典型socket編程的精髓。但是,還有其他技術(shù)。例如采用異步套接字通道,通過(guò)套接字建立通信,這可以大大降低效率。想對(duì)java有更深入的了解,可以參加java培訓(xùn),在專業(yè)老師的指導(dǎo)下,你可以很快掌握java的更多特性。
插座
在典型的套接字編程情況下,即使用 TCP 和 UDP 套接字的情況下,I/O 操作以阻塞和同步模式工作。這意味著當(dāng)客戶端套接字的線程調(diào)用讀取操作時(shí),它會(huì)阻塞服務(wù)器,直到數(shù)據(jù)可用。如果底層緩沖區(qū)已滿,這也可能會(huì)阻止寫入。這使得其他客戶端套接字線程停止,直到通道被釋放。這種類型的通道阻塞顯然是低效的。為了克服這種情況。相反,可以做的是等到線程完成其工作。客戶端套接字可以在服務(wù)器提供數(shù)據(jù)后立即通知;同時(shí),其他線程可以做其他事情,直到來(lái)自服務(wù)器的數(shù)據(jù)到達(dá)。如果服務(wù)器有多個(gè)打開的套接字,另一種方法是創(chuàng)建單獨(dú)的線程進(jìn)行通信。無(wú)論哪種情況,這都是一種解決方法,而不是適當(dāng)?shù)慕鉀Q方案。然而,正如我們將看到的,Java 通過(guò) SocketChannel 為這個(gè)問(wèn)題提供了一個(gè)解決方案。
套接字通道
另一方面,套接字通道是與服務(wù)器套接字建立通信的非阻塞方式。在這里,我們可以讓一個(gè)線程同時(shí)與多個(gè)打開的連接進(jìn)行通信。這是通過(guò)向 Selector 添加一堆 SocketChannel 來(lái)實(shí)現(xiàn)的。選擇器對(duì)象位于客戶端和服務(wù)器之間??蛻舳颂捉幼志€程通過(guò)循環(huán)選擇器的 select 方法來(lái)獲取套接字通道。它可以通知套接字通道的狀態(tài)是否已被接受、接收數(shù)據(jù)或關(guān)閉。這種技術(shù)可以在單個(gè)線程中與多個(gè)客戶端進(jìn)行通信,而無(wú)需維護(hù)多個(gè)線程和同步的開銷。在java培訓(xùn)中,培訓(xùn)課程不僅注重理論,更注重項(xiàng)目的實(shí)戰(zhàn)能力,能夠讓你快速適應(yīng)企業(yè)開發(fā)的進(jìn)度,成為企業(yè)所需要的JAVA人才。你可以在圖 1 中看到這一點(diǎn)。
異步套接字通道
支持異步套接字通道的類實(shí)際上是 Java NIO API 庫(kù)的一部分。思路是通過(guò)sockets實(shí)現(xiàn)非阻塞異步IO通信。異步 IO 利用回調(diào)代碼在 IO 完成時(shí)執(zhí)行,非阻塞的思想是指立即返回的 IO 操作,可以有數(shù)據(jù),也可以沒(méi)有數(shù)據(jù),或者錯(cuò)誤代碼。這意味著,在從非阻塞通道讀取時(shí),返回值或阻塞通道沒(méi)有延遲,直到返回有形的東西。有兩個(gè)與異步套接字操作相關(guān)的關(guān)鍵類。它們是 AsynchronousServerSocketChannel 和 AsynchronousSocketChannel;兩者都可以在名為 java.nio.channels 的包中找到。
AsynchronousServerSocketChannel 類的對(duì)象指定偵聽傳入客戶端連接請(qǐng)求的套接字服務(wù)器。只有在接受請(qǐng)求后才能開始交互。名為 AsynchronousSocketChannel 的類負(fù)責(zé)客戶端和服務(wù)器兩端的所有建立交互。
普通的,也就是同步套接字連接和異步套接字連接之間的主要區(qū)別在于,在后一種情況下,請(qǐng)求者會(huì)在每個(gè)操作完成后立即得到通知。同步套接字連接不是這種情況,因?yàn)樵谶@種情況下,它會(huì)阻塞通道,直到請(qǐng)求完成。
由于套接字通道的異步特性,有一個(gè)處理程序負(fù)責(zé)處理套接字操作的成功或失敗狀態(tài)。想學(xué)習(xí)java更多技能,建議參加java培訓(xùn),課程實(shí)時(shí)更新,緊跟市場(chǎng)和企業(yè),讓你學(xué)到最新的java技能,提高市場(chǎng)競(jìng)爭(zhēng)力。