lecture4非阻塞通信.ppt_第1頁
lecture4非阻塞通信.ppt_第2頁
lecture4非阻塞通信.ppt_第3頁
lecture4非阻塞通信.ppt_第4頁
lecture4非阻塞通信.ppt_第5頁
已閱讀5頁,還剩86頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第4章非阻塞通信、主要內(nèi)容、線程阻塞概念Java.nio包類簡介:實施阻塞模式和非阻塞模式(例如服務(wù)器套接字通道套接字通道選擇器/selection key/bytebuffer)2,或其他線程2,線程運(yùn)行同步代碼3,線程運(yùn)行對象的wait()方法,只有其他線程可以喚醒該對象的notify()或notifyAll()方法4,線程執(zhí)行I/O操作(例如ReadLine等),客戶端線程返回2。線程從套接字的輸入流讀取數(shù)據(jù)時,如果沒有足夠的數(shù)據(jù),它將處于阻塞狀態(tài),直到讀取足夠的數(shù)據(jù)或達(dá)到輸入流的結(jié)束或異常。輸入流的其他讀取方法: int read():輸入一個字節(jié)就足夠了。int read(byte

2、buff):輸入流字節(jié)數(shù)與數(shù)組長度相同。String readLine():輸入流中的字符串行已足夠。需要BufferReader的牙齒方法,如果客戶端節(jié)目線程進(jìn)入阻塞狀態(tài),則為3,線程從套接字的輸出流寫入數(shù)據(jù)時進(jìn)入阻塞狀態(tài),等待所有數(shù)據(jù)輸出,或者可能引發(fā)異常。如果輸出流的write()方法返回4,異常中止,或者在調(diào)用Socket的close()方法時將Socket設(shè)置為關(guān)閉,則服務(wù)器線程阻塞狀態(tài),1,執(zhí)行線程ServerSocket的accept()方法2,線程將數(shù)據(jù)從套接字的輸入流關(guān)閉如果未阻止此類輸入/輸出流的讀取和寫入操作,則稱為非阻塞I/o,4.1.2服務(wù)器多線程處理阻塞通信限制,創(chuàng)

3、建服務(wù)器套接字,接收連接套接字,將作業(yè)委派給工作線程, /非阻塞IF(套接字輸出流可寫數(shù)據(jù))將數(shù)據(jù)寫入/非阻塞輸出流,Java.nio包的主要類,支持阻塞和非阻塞通信的以下類服務(wù)器套接字通道3360服務(wù)器套接字的替代類,支持阻塞和非阻塞通信套接字通道3360套接字替代類:SelectionKey: SelectionKey對象(Java.nio包的基類)位于selector對象的selector對象的Selector中時,向Selector注冊表示ServerSocketChannel和SocketChannel的事件的句柄,Java.nio包的關(guān)鍵類,如何注冊事件?在Selector中注冊以

4、接收ServerSocketChannel牙齒連接準(zhǔn)備事件的代碼如下所示:注冊事件進(jìn)程selection key=server socket channel . register(Selector、selection key、Java.nio程序包中的關(guān)鍵類,interface channel,interface牙齒委托進(jìn)程有時稱為注冊事件進(jìn)程,SelectionKey中的某些靜態(tài)常量表示只有一個事件可以在事件類型ServerSocketChannel中激發(fā)。SelectionKey。OP_ACCEPT:至少具有一個客戶連接,并且接收指示服務(wù)器可以接收連接的就緒事件。SelectionKey類

5、靜態(tài)常量事件類型,SocketChannel可能發(fā)生的三個茄子事件:SelectionKey。OP_CONNECT:表示客戶與服務(wù)器之間的連接已成功建立的連接準(zhǔn)備事件。SelectionKey。OP_READ:輸入流中已包含可讀取數(shù)據(jù)的準(zhǔn)備讀取事件。您可以執(zhí)行讀取操作。SelectionKey。OP_WRITE:準(zhǔn)備寫入事件。可以將數(shù)據(jù)寫入輸出流。SocketChannel接收和發(fā)送數(shù)據(jù)的方法,讀取(ByteBuffer buffer):接收數(shù)據(jù)并將其存儲在參數(shù)中指定的ByteBuffer中。Write(ByteBuffer Buffer):傳輸參數(shù)中指定的buffer的數(shù)據(jù)。ByteBuff

6、er表示字節(jié)緩沖區(qū),這兩種方法都可以操作。繼承自Buffer類。特定基本類型元素的線性有限序列ByteBuffer中存儲的字節(jié)。轉(zhuǎn)換為字符串需要表示字符編碼的Charset類。提供將字節(jié)流轉(zhuǎn)換為字符串和字符串的方法。緩沖區(qū)緩沖區(qū)、數(shù)據(jù)輸入和輸出通常是耗時的操作。緩沖區(qū)可以提高兩個茄子的I/o操作效率,從而減少物理讀取和寫入的實際次數(shù)。緩沖區(qū)在創(chuàng)建時分配內(nèi)存。牙齒內(nèi)存始終重復(fù)使用,以減少動態(tài)分配和回收次數(shù)。緩沖區(qū)屬性:容量、限制、位置。相應(yīng)的方法:clear()、flip()、rewind()、緩沖區(qū)無法讀取和寫入超出限制的區(qū)域。讀取或?qū)懭霑r渡邊杏的第一個元素的索引位置。下一個要讀取或?qū)懭氲脑?/p>

7、的索引、更改屬性、clear()方法:清除緩沖區(qū)。將位置設(shè)置為0,將限制設(shè)置為牙齒容量,然后刪除顯示。讀取串行通道或put操作填充牙齒緩沖區(qū)之前調(diào)用牙齒方法。示例:buf . clear();/prepare buffer for reading in。讀取(buf);/Read data牙齒方法不能真正清除緩沖區(qū)中的數(shù)據(jù),但在大多數(shù)情況下,它用于清除數(shù)據(jù),更改屬性,filp()方法:反轉(zhuǎn)緩沖區(qū),因此好像可以從名稱中清除。首先,設(shè)置當(dāng)前位置的限制,然后將該位置設(shè)置為0。如果已經(jīng)定義了標(biāo)記,則將忽略該標(biāo)記。讀取串行通道或put操作后,調(diào)用牙齒方法以執(zhí)行串行通道寫入或相對get操作。示例:buf.

8、put(魔術(shù));/Prepend header in . read(buf);/read data into rest of buffer buf . flip();/Flip buffer out . write(buf);/Write header data to channel、更改屬性、rewind()方法:準(zhǔn)備緩沖區(qū)以重新讀取已包含的數(shù)據(jù)。也就是說,保持限制不變,并將位置設(shè)置為0。重新纏繞牙齒緩沖區(qū)。將位置設(shè)置為零,然后刪除標(biāo)記。在寫入串行通道或執(zhí)行g(shù)et操作之前調(diào)用牙齒方法(假定已正確設(shè)置限制)。例如:out . write(buf);/Write remaining data b

9、uf . rewind();/rewindbufferbuf.get(陣列);/copy data into array、bufferdemo、import Java . io . file input stream;import Java . io . fileoutputstream;import Java . nio . bytebuffer;import Java . nio . channels . file channel;buffer demo、publicclassbufferdemo publicstatic voidmain(string args)throws excep

10、tion./非直接緩沖bytebufferbb分配/0到100之間的字節(jié)格式for(inti=0;I100I).byteb=(byte)(math . random()* 100);bb . put(b);System.out.println(檔案寫入前緩沖區(qū)數(shù)據(jù));bb . flip();while(bb . has remaining()system . out . print(bb . get();System.out.println(“已讀取緩沖區(qū)數(shù)據(jù)”);與Bufferdemo,/buffer.txt文件關(guān)聯(lián)的通道file channel fc=new file output str

11、eam(buffer . txt)。將getchannel (/緩沖區(qū)數(shù)據(jù)寫入文件中的bb.flip()。fc . write(bb);/fc.force防止緩存(true);/關(guān)閉通道fc . close();Bb=空;Fc=空;Bufferdemo,/從文件讀取數(shù)據(jù)fc=new file input stream(buffer . txt)。get channel();bytebufferbb 2=bytebuffer . allocate(int)fc . size();fc . read(bb2);System.out.println(從文件讀取的緩沖區(qū)數(shù)據(jù));bb2 . flip()

12、;while(bb2 . has remaining()system . out . print(bb2 . get();system . out . print ln();fc . close();Bb2=空;Fc=空;緩沖區(qū)Buffer生成方法,Buffer類是抽象類,共有8個特定緩沖區(qū)類。最基本的緩沖區(qū)是ByteBuffer,存儲的數(shù)據(jù)單位是字節(jié)。ByteBuffer類不提供公共構(gòu)造方法。但是,獲取ByteBuffer實例的兩個茄子靜態(tài)工廠方法allocate(int capacity):返回容量緩沖區(qū)direct allocate(int capacity):從而返回容量int ind

13、ex(get)。put():相對寫入。將單元格中的數(shù)據(jù)寫入緩沖區(qū)中的當(dāng)前位置,然后在該位置添加1。插入索引(Put)。還有另一個compact()方法。刪除讀取或?qū)懭氲臄?shù)據(jù),并將剩馀數(shù)據(jù)從0放入limit-position區(qū)域。緩沖區(qū)Buffer生成方法;Buffer類是抽象類提示:計算機(jī)的信息存儲單位(1)位(Bit):表示二進(jìn)制數(shù)字0或1,是計算機(jī)存儲處理信息的最基本單位。(2)字節(jié):一個字節(jié)由8位組成。表示八個二進(jìn)制代碼,即完整的處理單元?,F(xiàn)在電腦上使用了很多美國國家信息更換標(biāo)準(zhǔn)代碼ASCII代碼(由美國國家標(biāo)準(zhǔn)委員會制定)。例如,字符“A”的二進(jìn)制編碼為“010000001”,即41H或65D“#”的二進(jìn)制編碼為“0010 0011”,即23H或35H。一般說,16位是一個單詞,32位是一個單詞,64位是兩個單詞。字符編碼charset,byte buffer encode(string str)byte buffer encod

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論