版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 1第第4章章 套接字與數(shù)據(jù)流套接字與數(shù)據(jù)流4.1 套接字套接字4.1.1 面向銜接的套接字面向銜接的套接字 4.1.2 無銜接的套接字無銜接的套接字4.2 數(shù)據(jù)流數(shù)據(jù)流4.2.1 文件流文件流4.2.2 內(nèi)存流內(nèi)存流4.2.3 網(wǎng)絡(luò)流網(wǎng)絡(luò)流4.2.4 StreamWriter與與StreamReader類類4.2.5 BinaryReader與與BinaryWriter類類2 2 本章教學(xué)目的本章教學(xué)目的學(xué)習(xí)套接字編程的根本方法,以及數(shù)據(jù)流相關(guān)類的用法。學(xué)習(xí)套接字編程的根本方法,以及數(shù)據(jù)流相關(guān)類的用法。 本章教學(xué)要求本章教學(xué)要求 1掌握套接字的概念及掌握套接字的概念及Socket類用法;類
2、用法; 2掌握面向銜接套接字編程、無銜接套接字編程根本步掌握面向銜接套接字編程、無銜接套接字編程根本步驟驟 3掌握掌握FileStream、MemoryStream、NetworkStream類的用法;類的用法; 4掌握掌握StreamReader、StreamWriter、BinaryReader、 BinaryWriter類的根本用法。類的根本用法。本章重點本章重點3 34.1 套接字套接字 一個銜接由它的兩個端點標(biāo)識,這樣的端點稱為套接字。一個銜接由它的兩個端點標(biāo)識,這樣的端點稱為套接字。4 44.1 套接字續(xù)套接字續(xù)) 套接字是支持套接字是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通訊的根本操作單元。
3、可協(xié)議的網(wǎng)絡(luò)通訊的根本操作單元??梢詫⑻捉幼挚醋鞑煌鳈C(jī)間的進(jìn)程進(jìn)展雙向通訊的端點。以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)展雙向通訊的端點。 上圖銜接上圖銜接1的一對套接字為:的一對套接字為: 3,5000和和22,8888 上圖銜接上圖銜接2的一對套接字為:的一對套接字為: 3,5001和和22,8888 對于對于UDP協(xié)議雖然兩個進(jìn)程之間沒有建立銜接,但是也同協(xié)議雖然兩個進(jìn)程之間沒有建立銜接,但是也同樣存在發(fā)送端點,和接納端點,也同樣運用套接字的概念。樣存在發(fā)送端點,和接納端點,也同樣運用套接字的概念。5 5
4、4.1 套接字續(xù)套接字續(xù)) 套接字的類型有:套接字的類型有: 流式套接字:提供了面向銜接的、可靠的、數(shù)據(jù)無錯并且流式套接字:提供了面向銜接的、可靠的、數(shù)據(jù)無錯并且無反復(fù)的數(shù)據(jù)發(fā)送效力,而且接納數(shù)據(jù)的順序和發(fā)送數(shù)據(jù)無反復(fù)的數(shù)據(jù)發(fā)送效力,而且接納數(shù)據(jù)的順序和發(fā)送數(shù)據(jù)的順序是一樣的。的順序是一樣的。 數(shù)據(jù)報套接字:提供了面向無銜接的效力數(shù)據(jù)報套接字:提供了面向無銜接的效力,它以獨立的數(shù)據(jù)它以獨立的數(shù)據(jù)包方式發(fā)送數(shù)據(jù)包方式發(fā)送數(shù)據(jù)(數(shù)據(jù)包長度不能大于數(shù)據(jù)包長度不能大于32KB),不提供正確,不提供正確性檢查,也不保證各數(shù)據(jù)包的發(fā)送順序和接納順序一樣性檢查,也不保證各數(shù)據(jù)包的發(fā)送順序和接納順序一樣 ,因
5、此,能夠出現(xiàn)數(shù)據(jù)的重發(fā)、喪失等景象。因此,能夠出現(xiàn)數(shù)據(jù)的重發(fā)、喪失等景象。 原始套接字:用于直接訪問協(xié)議的較低層。常用于檢驗新原始套接字:用于直接訪問協(xié)議的較低層。常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有效力中配置的新設(shè)備,普通不提倡的協(xié)議實現(xiàn)或訪問現(xiàn)有效力中配置的新設(shè)備,普通不提倡直接運用原始套接字。直接運用原始套接字。 6 64.1 套接字續(xù)套接字續(xù)) Socket類包含在類包含在System.Net.Sockets命名空間中。命名空間中。 一個一個Socket實例包含了一個本地或者一個遠(yuǎn)程端點的套接實例包含了一個本地或者一個遠(yuǎn)程端點的套接字信息。字信息。 運用運用Socket類編程,由于很多細(xì)節(jié)
6、都需求本人思索,相對類編程,由于很多細(xì)節(jié)都需求本人思索,相對來說復(fù)雜一些,易出錯。普通對套接字編程比較熟習(xí)的人,來說復(fù)雜一些,易出錯。普通對套接字編程比較熟習(xí)的人,或者運用非規(guī)范協(xié)議自定義的新協(xié)議進(jìn)展編程的時候,或者運用非規(guī)范協(xié)議自定義的新協(xié)議進(jìn)展編程的時候,才運用才運用Socket類。類。 Socket類的構(gòu)造函數(shù)為:類的構(gòu)造函數(shù)為: public Socket( AddressFamily addressFamily, /網(wǎng)絡(luò)類型網(wǎng)絡(luò)類型 SocketType socketType, /套接字類型套接字類型 ProtocolType protocolType); /運用的協(xié)議運用的協(xié)議 7
7、 74.1 套接字續(xù)套接字續(xù))參數(shù)含義:參數(shù)含義:1addressFamily addressFamily表示網(wǎng)絡(luò)類型,該參數(shù)運用表示網(wǎng)絡(luò)類型,該參數(shù)運用AddressFamily枚舉指定枚舉指定Socket運用的尋址方案運用的尋址方案例如例如AddressFamily.InterNetwork表示表示IP版本版本4的地址。的地址。8 84.1 套接字續(xù)套接字續(xù))9 94.1 套接字續(xù)套接字續(xù))2socketTypesocketTyp指定指定Socket的類型,該參數(shù)運用的類型,該參數(shù)運用SocketType枚舉指定運用哪種套接字。例如枚舉指定運用哪種套接字。例如:SocketType.Str
8、eam闡明銜接是基于流套接字的闡明銜接是基于流套接字的SocketType.Dgram表示銜接是基于數(shù)據(jù)報套接字表示銜接是基于數(shù)據(jù)報套接字SocketType.Raw表示銜接基于原始套接字;表示銜接基于原始套接字; 詳細(xì)見課本表詳細(xì)見課本表4-210104.1 套接字續(xù)套接字續(xù))3protocolTypeprotocolType指定指定Socket運用的協(xié)議,該參數(shù)運用運用的協(xié)議,該參數(shù)運用ProtocolType枚舉指定運用哪種協(xié)議。例如枚舉指定運用哪種協(xié)議。例如:ProtocolType.Tcp闡明銜接協(xié)議是闡明銜接協(xié)議是TCPProtocolType.Udp闡明銜接協(xié)議是闡明銜接協(xié)議是U
9、DP詳細(xì)見課本表詳細(xì)見課本表4-311114.1 套接字續(xù)套接字續(xù)) Socket構(gòu)造函數(shù)的三個參數(shù)中,對于網(wǎng)絡(luò)上的IP通訊來說,AddressFamily總是運用AddressFamily.InterNetwork枚舉值。而SocketType參數(shù)那么與ProtocolType參數(shù)配合運用,不允許其他的匹配方式,也不允許混淆匹配。下表列出了可用于IP通訊的組合。 SocketTypeProtocolType說明說明DgramUdp無連接通信無連接通信StreamTcp面向連接的通信面向連接的通信RawIcmpInternet控制報文協(xié)議控制報文協(xié)議RawRaw簡單簡單IP包通信包通信1212
10、4.1.1 面向銜接的套接字面向銜接的套接字 IP銜接領(lǐng)域有兩種通訊類型:銜接領(lǐng)域有兩種通訊類型: 面向銜接的面向銜接的connection-oriented 無銜接的無銜接的connectionless。 根據(jù)銜接啟動的方式以及本地套接字要銜接的目的,套接根據(jù)銜接啟動的方式以及本地套接字要銜接的目的,套接字之間的銜接過程可以分為三個步驟:字之間的銜接過程可以分為三個步驟: 效力器監(jiān)聽效力器監(jiān)聽 客戶端懇求客戶端懇求 銜接確認(rèn)銜接確認(rèn)13134.1.1 面向銜接的套接字面向銜接的套接字 效力器監(jiān)聽:是指效力器套接字并不定位詳細(xì)的客戶端套效力器監(jiān)聽:是指效力器套接字并不定位詳細(xì)的客戶端套接字,而
11、是處于等待銜接的形狀,實時監(jiān)控網(wǎng)絡(luò)形狀。接字,而是處于等待銜接的形狀,實時監(jiān)控網(wǎng)絡(luò)形狀。 客戶端懇求:是指由客戶端的套接字提出銜接懇求,要銜客戶端懇求:是指由客戶端的套接字提出銜接懇求,要銜接的目的是效力器的套接字。為此,客戶端的套接字必需接的目的是效力器的套接字。為此,客戶端的套接字必需首先描畫它要銜接的效力器的套接字,指出效力器套接字首先描畫它要銜接的效力器的套接字,指出效力器套接字的地址和端口號,然后再向效力器套接字提出銜接懇求。的地址和端口號,然后再向效力器套接字提出銜接懇求。 銜接確認(rèn):是指當(dāng)效力器套接字監(jiān)聽到客戶端套接字的銜銜接確認(rèn):是指當(dāng)效力器套接字監(jiān)聽到客戶端套接字的銜接懇求時
12、,它就呼應(yīng)客戶端套接字的懇求,把效力器套接接懇求時,它就呼應(yīng)客戶端套接字的懇求,把效力器套接字的信息發(fā)給客戶端,一旦客戶端確認(rèn)了此信息,銜接即字的信息發(fā)給客戶端,一旦客戶端確認(rèn)了此信息,銜接即可建立。而效力器套接字繼續(xù)監(jiān)聽其他客戶端套接字的銜可建立。而效力器套接字繼續(xù)監(jiān)聽其他客戶端套接字的銜接懇求。接懇求。14144.1.1 面向銜接的套接字面向銜接的套接字Socket()Bind()Listen()Accept()Receive()Send()Close()Socket()Connect()Send()Receive()Close()效力器端 客戶端面向銜接的套接字編程15154.1.1 面
13、向銜接的套接字面向銜接的套接字 同步同步TCP編寫效力器端程序的普通步驟為:編寫效力器端程序的普通步驟為: 1) 創(chuàng)建一個包含采用的網(wǎng)絡(luò)類型、數(shù)據(jù)傳輸類型和協(xié)議類創(chuàng)建一個包含采用的網(wǎng)絡(luò)類型、數(shù)據(jù)傳輸類型和協(xié)議類型的本地套接字對象,并將其與效力器的型的本地套接字對象,并將其與效力器的IP地址和端口號地址和端口號綁定。這個過程可以經(jīng)過綁定。這個過程可以經(jīng)過Socket類。類。 2) 在指定的端口進(jìn)展監(jiān)聽,以便接受客戶端銜接懇求。在指定的端口進(jìn)展監(jiān)聽,以便接受客戶端銜接懇求。 3) 一旦接受了客戶端的銜接懇求,就根據(jù)客戶端發(fā)送的銜一旦接受了客戶端的銜接懇求,就根據(jù)客戶端發(fā)送的銜接信息創(chuàng)建與該客戶端對
14、應(yīng)的接信息創(chuàng)建與該客戶端對應(yīng)的Socket對象。對象。 4) 根據(jù)創(chuàng)建的根據(jù)創(chuàng)建的Socket對象,分別與每個銜接的客戶進(jìn)展對象,分別與每個銜接的客戶進(jìn)展數(shù)據(jù)傳輸。數(shù)據(jù)傳輸。 5) 根據(jù)傳送信息情況確定能否封鎖與對方的銜接。根據(jù)傳送信息情況確定能否封鎖與對方的銜接。16164.1.1 面向銜接的套接字面向銜接的套接字 運用同步運用同步TCP編寫客戶端程序的普通步驟為:編寫客戶端程序的普通步驟為: 1) 創(chuàng)建一個包含傳輸過程中采用的網(wǎng)絡(luò)類型、數(shù)據(jù)創(chuàng)建一個包含傳輸過程中采用的網(wǎng)絡(luò)類型、數(shù)據(jù)傳輸類型和協(xié)議類型的傳輸類型和協(xié)議類型的Socket對象。對象。 2) 與遠(yuǎn)程效力器建立銜接。與遠(yuǎn)程效力器建立
15、銜接。 3) 與效力器進(jìn)展數(shù)據(jù)傳輸。與效力器進(jìn)展數(shù)據(jù)傳輸。 4) 完成任務(wù)后,向效力器發(fā)送封鎖信息,并封鎖與完成任務(wù)后,向效力器發(fā)送封鎖信息,并封鎖與效力器的銜接。效力器的銜接。17174.1.1 面向銜接的套接字續(xù)面向銜接的套接字續(xù)1.建立銜接效力器建立銜接效力器IPHostEntry local = Dns.GetHostByName(Dns.GetHostName();IPEndPoint iep = new IPEndPoint(local.AddressList0, 1180);Socket localSocket = new Socket( AddressFamily.InterN
16、etwork, SocketType.Stream, ProtocolType.Tcp);localSocket.Bind(iep);locatSocket.Listen(10);Socket clientSocket = localSocket.Accept();18184.1.1 面向銜接的套接字續(xù)面向銜接的套接字續(xù)1.建立銜接客戶端建立銜接客戶端IPAddress remoteHost = IPAddress.Parse();PEndPoint iep = new IPEndPoint(remoteHost, 1180);Socket localSocket = n
17、ew Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);localSocket.Connect(iep);19194.1.1 面向銜接的套接字續(xù)面向銜接的套接字續(xù)2. 發(fā)送、接納信息效力器發(fā)送、接納信息效力器 Socket clientSocket = localSocket.Accept();/建立銜接后,利用建立銜接后,利用Send方法向客戶端發(fā)送信息方法向客戶端發(fā)送信息clientSocket.Send(Encoding.ASCII.GetBytes(server send Hello);/接
18、納客戶端信息接納客戶端信息byte myresult = new Byte1024;int receiveNum = clientSocket.Receive(myresult);Console.WriteLine(接納客戶端音訊:接納客戶端音訊:0, Encoding.ASCII.GetString(myresult);20204.1.1 面向銜接的套接字續(xù)面向銜接的套接字續(xù)2. 發(fā)送、接納信息客戶端發(fā)送、接納信息客戶端/建立銜接勝利后,向效力器發(fā)送信息建立銜接勝利后,向效力器發(fā)送信息string sendMessage = client send Message Hello+DateTim
19、e.Now;localSocket.Send(Encoding.ASCII.GetBytes(sendMessage);Console.WriteLine(向效力器發(fā)送音訊向效力器發(fā)送音訊:0, sendMessage);/接納效力器信息接納效力器信息byte result = new Byte1024;localSocket.Receive(result);Console.WriteLine(接納效力器音訊:接納效力器音訊:0, Encoding.ASCII.GetString(result);21214.1.1 面向銜接的套接字續(xù)面向銜接的套接字續(xù)3.封鎖銜接封鎖銜接通訊完成后,必需先用通
20、訊完成后,必需先用Shutdown方法停頓會話,然后封鎖方法停頓會話,然后封鎖Socket實例實例 。例如:例如: sock.Shutdown(SocketShutdown.Both);sock.Close();22224.1.2 無銜接的套接字 UDP運用無銜接的套接字,無銜接的套接字不需求在網(wǎng)絡(luò)運用無銜接的套接字,無銜接的套接字不需求在網(wǎng)絡(luò)設(shè)備之間發(fā)送銜接信息。設(shè)備之間發(fā)送銜接信息。 留意留意:必需運用必需運用Bind方法將套接字綁定到一個本地地方法將套接字綁定到一個本地地址和端口之后才干運用址和端口之后才干運用ReceiveFrom方法接納數(shù)據(jù),假設(shè)方法接納數(shù)據(jù),假設(shè)只發(fā)送而不接納,那么
21、不需求運用只發(fā)送而不接納,那么不需求運用Bind方法。方法。23234.1.2 無銜接的套接字Socket()Bind()ReceiveFrom()SendTo()Close()Socket()Bind()SendTo()ReceiveFrom()Close()設(shè)備1設(shè)備2無銜接套接字編程2424第第4章章 套接字與數(shù)據(jù)流套接字與數(shù)據(jù)流4.1 套接字套接字4.1.1 面向銜接的套接字面向銜接的套接字 4.1.2 無銜接的套接字無銜接的套接字4.2 數(shù)據(jù)流數(shù)據(jù)流4.2.1 文件流文件流4.2.2 內(nèi)存流內(nèi)存流4.2.3 網(wǎng)絡(luò)流網(wǎng)絡(luò)流4.2.4 StreamWriter與與StreamReader
22、類類4.2.5 BinaryReader與與BinaryWrite類類25254.2 數(shù)據(jù)流數(shù)據(jù)流流流stream是對串行傳輸?shù)臄?shù)據(jù)以字節(jié)為單位是對串行傳輸?shù)臄?shù)據(jù)以字節(jié)為單位的一種籠統(tǒng)表示,底層的設(shè)備可以是文件、外部設(shè)備、的一種籠統(tǒng)表示,底層的設(shè)備可以是文件、外部設(shè)備、主存、網(wǎng)絡(luò)套接字等。主存、網(wǎng)絡(luò)套接字等。26264.2 數(shù)據(jù)流數(shù)據(jù)流 流提供三種根本操作:流提供三種根本操作: 寫入:將數(shù)據(jù)從內(nèi)存緩沖區(qū)傳輸?shù)酵獠吭?。寫入:將?shù)據(jù)從內(nèi)存緩沖區(qū)傳輸?shù)酵獠吭础?讀取:將數(shù)據(jù)從外部源傳輸?shù)絻?nèi)存緩沖區(qū)。讀?。簩?shù)據(jù)從外部源傳輸?shù)絻?nèi)存緩沖區(qū)。 查找:重新設(shè)置流的當(dāng)前位置,以便隨機(jī)讀寫。需求留意查找:重新設(shè)
23、置流的當(dāng)前位置,以便隨機(jī)讀寫。需求留意的是,并不是一切的流類型都可以支持查找,例如,網(wǎng)絡(luò)的是,并不是一切的流類型都可以支持查找,例如,網(wǎng)絡(luò)流沒有當(dāng)前位置的一致概念,因此普通不支持查找。流沒有當(dāng)前位置的一致概念,因此普通不支持查找。 闡明:闡明:Stream類提供有多種操作流的方法,其中類提供有多種操作流的方法,其中Read和和Write方法是方法是Stream類及其派生類都提供的實現(xiàn),可支持類及其派生類都提供的實現(xiàn),可支持在字節(jié)級別上對數(shù)據(jù)進(jìn)展讀寫。實踐的程序開發(fā)中,僅支在字節(jié)級別上對數(shù)據(jù)進(jìn)展讀寫。實踐的程序開發(fā)中,僅支持字節(jié)級別的數(shù)據(jù)處置睬給開發(fā)人員帶來不便。持字節(jié)級別的數(shù)據(jù)處置睬給開發(fā)人員
24、帶來不便。27274.2 數(shù)據(jù)流數(shù)據(jù)流 提供字符串或二進(jìn)制方式讀取或?qū)懭肓鳌L峁┳址蚨M(jìn)制方式讀取或?qū)懭肓鳌?優(yōu)點:優(yōu)點: 方法更靈敏方法更靈敏 部分方法可處理部分方法可處理TCP音訊通訊無邊境問題音訊通訊無邊境問題28284.2.1 FileStream類類 FileStream類承繼于類承繼于Stream類,一個類,一個FileStream類的實例類的實例實踐上代表一個磁盤文件,運用實踐上代表一個磁盤文件,運用FileStream類可以對文件類可以對文件系統(tǒng)上的文件進(jìn)展讀取、寫入、翻開和封鎖操作。系統(tǒng)上的文件進(jìn)展讀取、寫入、翻開和封鎖操作。 1、創(chuàng)建、創(chuàng)建FileStream實例實例
25、(1)常用的構(gòu)造函數(shù)具有三個參數(shù),例如:常用的構(gòu)造函數(shù)具有三個參數(shù),例如: FileStream(string path,FileMode mode, FileAccess access) 29294.2.1 FileStream類類 FileMode值用于指定當(dāng)文件不存在時能否創(chuàng)建該文件,并值用于指定當(dāng)文件不存在時能否創(chuàng)建該文件,并確定是保管還是改寫現(xiàn)有文件的內(nèi)容確定是保管還是改寫現(xiàn)有文件的內(nèi)容 30304.2.1 FileStream類類 FileAccess值是枚舉的一個成員,它控制對文件的訪問權(quán)限。表值是枚舉的一個成員,它控制對文件的訪問權(quán)限。表4-10列出了列出了FileAccess
26、一切的枚舉方式一切的枚舉方式 (2)File和和FileInfo類也提供了創(chuàng)建類也提供了創(chuàng)建FileStream對象的方法。其中,對象的方法。其中,OpenRead方法前往只讀文件流,方法前往只讀文件流,OpenWrite方法前往只寫文件流。方法前往只寫文件流。 例如:例如:FileStream fs= File.OpenRead(C:File1.txt);31314.2.1 FileStream類類2. 讀文件讀文件 在獲取在獲取FileStream實例之后,可利用實例之后,可利用FileStream對象的對象的Read方法讀取文件中的數(shù)據(jù)。該方法用于從流中讀取字節(jié)塊并將方法讀取文件中的數(shù)據(jù)
27、。該方法用于從流中讀取字節(jié)塊并將該數(shù)據(jù)寫入給定字節(jié)數(shù)組中。其語法方式為:該數(shù)據(jù)寫入給定字節(jié)數(shù)組中。其語法方式為: public override int Read(byte array,int offset, int count) array : 存儲從文件流中讀取的數(shù)據(jù)。存儲從文件流中讀取的數(shù)據(jù)。 offset : array字節(jié)數(shù)組中開場寫入數(shù)據(jù)的下標(biāo),普通為字節(jié)數(shù)組中開場寫入數(shù)據(jù)的下標(biāo),普通為0。 size : 要從文件流中讀出字節(jié)的大小要從文件流中讀出字節(jié)的大小 前往值前往值: 從從FileStream中讀取的字節(jié)數(shù)。中讀取的字節(jié)數(shù)。【例【例3-2】利用】利用FileStream的的R
28、ead方法從一個文本文件中讀取內(nèi)方法從一個文本文件中讀取內(nèi)容并顯示在屏幕上。容并顯示在屏幕上。32324.2.1 FileStream類類3. 寫文件寫文件Stream類及其一切子類都提供了類及其一切子類都提供了Write方法,方法,F(xiàn)ileStream類也不例外。該方法可將字節(jié)數(shù)組寫入類也不例外。該方法可將字節(jié)數(shù)組寫入流。語法方式為流。語法方式為public override void Write (byte buffer, /包含要寫入流的數(shù)據(jù)包含要寫入流的數(shù)據(jù)int offset, / buffer中開場寫入數(shù)據(jù)的位置中開場寫入數(shù)據(jù)的位置int size /要寫入流的字節(jié)數(shù)要寫入流的字節(jié)
29、數(shù))【例【例3-3】利用】利用FileStream的的Write方法向文本文件中方法向文本文件中追加數(shù)據(jù)。追加數(shù)據(jù)。33334.2.2 MemoryStream類類 MemoryStream類表示的是保管在內(nèi)存中的數(shù)據(jù)流。由內(nèi)存類表示的是保管在內(nèi)存中的數(shù)據(jù)流。由內(nèi)存流封裝的數(shù)據(jù)可以在內(nèi)存中直接訪問。流封裝的數(shù)據(jù)可以在內(nèi)存中直接訪問。 MemoryStream類的構(gòu)造函數(shù)具有多種重載方式,常用的構(gòu)類的構(gòu)造函數(shù)具有多種重載方式,常用的構(gòu)造函數(shù)有:造函數(shù)有: 1MemoryStream () 該構(gòu)造函數(shù)初始分配的容量大小為該構(gòu)造函數(shù)初始分配的容量大小為0,隨著數(shù)據(jù)的不斷寫入,隨著數(shù)據(jù)的不斷寫入容量可
30、以不斷擴(kuò)展。容量可以不斷擴(kuò)展。 2MemoryStream (Byte) 該構(gòu)造函數(shù)獲取的該構(gòu)造函數(shù)獲取的MemoryStream實例根據(jù)實例根據(jù)Byte字節(jié)數(shù)組字節(jié)數(shù)組進(jìn)展初始化,并且實例容量大小固定即為字節(jié)數(shù)組的長度。進(jìn)展初始化,并且實例容量大小固定即為字節(jié)數(shù)組的長度。由于實例的容量不能擴(kuò)展,該構(gòu)造函數(shù)普通用于數(shù)據(jù)不發(fā)生由于實例的容量不能擴(kuò)展,該構(gòu)造函數(shù)普通用于數(shù)據(jù)不發(fā)生變化的場所。變化的場所。34344.2.2 MemoryStream類類 String testdata = 測試數(shù)據(jù)測試數(shù)據(jù); char chars = testdata.ToCharArray(); Byte byte
31、s = new Byteencoder.GetByteCount(chars, 0, chars.Length, true); MemoryStream mem = new MemoryStream(bytes);3MemoryStream (int capacity) 經(jīng)過該構(gòu)造函數(shù)創(chuàng)建初始容量大小為經(jīng)過該構(gòu)造函數(shù)創(chuàng)建初始容量大小為capacity的實例,并且的實例,并且實例容量大小可擴(kuò)展。實例容量大小可擴(kuò)展。【例【例3-4】利用】利用MemoryStream暫存數(shù)據(jù)。暫存數(shù)據(jù)。35354.2.3 網(wǎng)絡(luò)流網(wǎng)絡(luò)流 在在System.Net.Sockets稱號空間中有一個稱號空間中有一個Netw
32、orkStream類,用于經(jīng)過網(wǎng)絡(luò)套接字發(fā)送和接納數(shù)據(jù)。類,用于經(jīng)過網(wǎng)絡(luò)套接字發(fā)送和接納數(shù)據(jù)。 NetworkStream類支持對網(wǎng)絡(luò)數(shù)據(jù)的同步或異步訪問,它類支持對網(wǎng)絡(luò)數(shù)據(jù)的同步或異步訪問,它可被視為在數(shù)據(jù)來源端和接納端之間架設(shè)了一個數(shù)據(jù)通道可被視為在數(shù)據(jù)來源端和接納端之間架設(shè)了一個數(shù)據(jù)通道. 只用于面向銜接的數(shù)據(jù)傳輸只用于面向銜接的數(shù)據(jù)傳輸3636 寫入操作是指從來源端內(nèi)存緩沖區(qū)到網(wǎng)絡(luò)上的數(shù)據(jù)傳輸;寫入操作是指從來源端內(nèi)存緩沖區(qū)到網(wǎng)絡(luò)上的數(shù)據(jù)傳輸; 讀取操作是從網(wǎng)絡(luò)上到接納端內(nèi)存緩沖區(qū)如字節(jié)數(shù)組讀取操作是從網(wǎng)絡(luò)上到接納端內(nèi)存緩沖區(qū)如字節(jié)數(shù)組的數(shù)據(jù)傳輸。的數(shù)據(jù)傳輸。4.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流
33、續(xù)37374.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流續(xù) NetworkStream的用法的用法 1、構(gòu)造、構(gòu)造NetworkStream: 1利用利用TcpClient獲取網(wǎng)絡(luò)流對象,例如:獲取網(wǎng)絡(luò)流對象,例如:TcpClient tcpClient=new TcpClient();tcpClient.Connect(abcd, 51888);NetworkStream networkStream = client.GetStream(); 2利用利用Socket獲取網(wǎng)絡(luò)流對象,例如:獲取網(wǎng)絡(luò)流對象,例如:NetworkStream myNetworkStream = new NetworkStream(my
34、Socket);38384.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流續(xù)2、發(fā)送數(shù)據(jù)、發(fā)送數(shù)據(jù) public override void Write (byte buffer,int offset,int size )39394.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流續(xù)3、接納數(shù)據(jù)、接納數(shù)據(jù)public override int Read (InAttribute OutAttribute byte buffer,int offset,int size) 各參數(shù)的含義各參數(shù)的含義: buffer:內(nèi)存中用于存儲從內(nèi)存中用于存儲從NetworkStream讀取的讀取的數(shù)據(jù)的位置。數(shù)據(jù)的位置。offset:buffer 中開場將數(shù)據(jù)
35、存儲到的位置。中開場將數(shù)據(jù)存儲到的位置。Size:要從要從NetworkStream中讀取的字節(jié)數(shù)。中讀取的字節(jié)數(shù)。前往值前往值:實踐從實踐從NetworkStream中讀取的字節(jié)數(shù)。中讀取的字節(jié)數(shù)。40404.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流續(xù)Write方法:方法:NetworkStream對象的對象的Write方法的前往值為方法的前往值為void,該對象之所以不前,該對象之所以不前往實踐發(fā)送的字節(jié)數(shù),是由于能保證字節(jié)數(shù)組中的數(shù)據(jù)全部發(fā)送到往實踐發(fā)送的字節(jié)數(shù),是由于能保證字節(jié)數(shù)組中的數(shù)據(jù)全部發(fā)送到TCP發(fā)送緩沖區(qū)中。發(fā)送緩沖區(qū)中。 在運用在運用NetworkStream對象的對象的Write方法前最好
36、先檢測方法前最好先檢測NetworkStream對象的對象的Writeable屬性能否為屬性能否為True。 假設(shè)發(fā)送的全部是單行文本信息,創(chuàng)建假設(shè)發(fā)送的全部是單行文本信息,創(chuàng)建NetworkStream對象后,運用對象后,運用StreamReader和和StreamWriter的的ReadLine和和WriteLine方法更簡單。方法更簡單。Read方法:方法:調(diào)用調(diào)用NetworkStream類的類的Read方法前應(yīng)確保方法前應(yīng)確保NetworkStream對象的對象的CanRead屬性值有效屬性值有效由于有能夠由于有能夠TCP接納緩沖區(qū)還沒有接納到對方發(fā)送過來的指定長度的數(shù)接納緩沖區(qū)還沒
37、有接納到對方發(fā)送過來的指定長度的數(shù)據(jù),所以據(jù),所以Read方法有一個整型的前往值。方法有一個整型的前往值。假設(shè)遠(yuǎn)程主機(jī)封鎖了套接字銜接,并且此時有效數(shù)據(jù)曾經(jīng)被完全接納,假設(shè)遠(yuǎn)程主機(jī)封鎖了套接字銜接,并且此時有效數(shù)據(jù)曾經(jīng)被完全接納,那么那么Read方法的前往值將會是方法的前往值將會是0字節(jié)。字節(jié)。41414.2.3 網(wǎng)絡(luò)流續(xù)網(wǎng)絡(luò)流續(xù) 運用運用NetworkStream對象時,需求留意:對象時,需求留意: 1經(jīng)過經(jīng)過DataAvailable屬性,可以迅速查看在緩沖區(qū)中屬性,可以迅速查看在緩沖區(qū)中能否有數(shù)據(jù)等待讀出。能否有數(shù)據(jù)等待讀出。 2網(wǎng)絡(luò)流沒有當(dāng)前位置的概念,因此它不支持對數(shù)據(jù)流網(wǎng)絡(luò)流沒有當(dāng)
38、前位置的概念,因此它不支持對數(shù)據(jù)流的查找和隨機(jī)訪問,的查找和隨機(jī)訪問,NetworkStream對象的對象的CanSeek屬性屬性一直前往一直前往false,讀取,讀取Position屬性和調(diào)用屬性和調(diào)用Seek方法時,都方法時,都會引發(fā)會引發(fā)NotSupportedException異常。異常。 3網(wǎng)絡(luò)數(shù)據(jù)傳輸完成后,不要忘記用網(wǎng)絡(luò)數(shù)據(jù)傳輸完成后,不要忘記用Close方法封鎖方法封鎖NetworkStream對象。對象。42424.2.4 StreamWriter與與StreamReader類類 可以看到一切的可以看到一切的NetworkStream、MemoryStream、FileStr
39、eam類都提供了以字節(jié)為根本單位的讀寫方法,但類都提供了以字節(jié)為根本單位的讀寫方法,但是這種方法需求首先將待寫入的數(shù)據(jù)轉(zhuǎn)化為字節(jié)數(shù)組后才是這種方法需求首先將待寫入的數(shù)據(jù)轉(zhuǎn)化為字節(jié)數(shù)組后才可以進(jìn)展讀寫,當(dāng)操作的是運用字符編碼的文本數(shù)據(jù)時,可以進(jìn)展讀寫,當(dāng)操作的是運用字符編碼的文本數(shù)據(jù)時,給開發(fā)人員帶來了不便。給開發(fā)人員帶來了不便。 StreamReader類主要完成以一種特定的編碼從流中讀取字類主要完成以一種特定的編碼從流中讀取字符的功能,普通用于對文本數(shù)據(jù)的讀取操作;符的功能,普通用于對文本數(shù)據(jù)的讀取操作; StreamWriter類那么主要以特定的編碼向流中寫入字符,類那么主要以特定的編碼向
40、流中寫入字符,普通用于對文本數(shù)據(jù)的寫操作。普通用于對文本數(shù)據(jù)的寫操作。43434.2.4 StreamWriter與與StreamReader類類1、創(chuàng)建、創(chuàng)建StreamWriter實例實例1StreamWriter (String path) 根據(jù)文件途徑創(chuàng)建以根據(jù)文件途徑創(chuàng)建以UTF-8編碼編碼StreamWriter對象。例如:對象。例如: StreamWriter sw= new StreamWriter (C:file1.txt);2File及及FileInfo類提供的類提供的CreateText方法。例如:方法。例如: StreamWriter sw = File.CreateT
41、ext (C:file1.txt);44444.2.4 StreamWriter與與StreamReader類類1、創(chuàng)建、創(chuàng)建StreamWriter實例續(xù)實例續(xù)3StreamWriter (Stream stream)直接運用流對象創(chuàng)建直接運用流對象創(chuàng)建StreamWriter對象。例如:對象。例如: FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter (fs);假設(shè)曾經(jīng)有了網(wǎng)絡(luò)流對象,同樣可以直接對網(wǎng)絡(luò)流對象進(jìn)假設(shè)曾
42、經(jīng)有了網(wǎng)絡(luò)流對象,同樣可以直接對網(wǎng)絡(luò)流對象進(jìn)展封裝。展封裝。 NetworkStream networkStream = client.GetStream(); StreamWriter sw = new StreamWriter (networkStream);45454.2.4 StreamWriter與與StreamReader類類2、寫入文本、寫入文本 利用利用StreamWriter類將以一種特定的編碼向流中寫入字符。類將以一種特定的編碼向流中寫入字符。常見方法如下所示:常見方法如下所示: Write():向數(shù)據(jù)流寫入數(shù)據(jù)。:向數(shù)據(jù)流寫入數(shù)據(jù)。Write()方法只是把傳送給它的方法只是把傳送給它的字符串寫入流,但不追加換行符,因此可以運用字符串寫入流,但不追加換行符,因此可以運用Write()語語句寫入完好的句子或段落。句寫入完好的句子或段落。 WriteLine():向數(shù)據(jù)流寫入指定數(shù)據(jù)和一個換行符。:向數(shù)據(jù)流寫入指定數(shù)據(jù)和一個換行符。 Close():封鎖流。:封鎖流。【例【例3-5】利用】利
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《號線自動化控制》課件
- 《保護(hù)我們的牙齒》課件
- 代購專柜采購合同模板
- 出售果園合同范例
- 家電工程合同模板
- 新質(zhì)生產(chǎn)力與智能物流
- 孩子收養(yǎng)合同范例
- 教育強(qiáng)國與教育質(zhì)量的全面提升
- 店鋪交割合同范例
- 地泵出租合同模板
- 2024年官方獸醫(yī)考試題庫(單選題)
- 期中測試卷(1-4單元)(試題)-2024-2025學(xué)年人教版數(shù)學(xué)六年級上冊
- 前程無憂行測筆試題庫
- 中華民族發(fā)展史智慧樹知到期末考試答案章節(jié)答案2024年云南大學(xué)
- 2024春期國開電大法學(xué)本科《國際法》在線形考(形考任務(wù)1至5)試題及答案
- 冷卻塔技術(shù)規(guī)格書
- 國家開放大學(xué)電大《小學(xué)語文教學(xué)研究》形考任務(wù)3-4試題及答案
- 黑布林-Peter-Pan-中英雙語閱讀
- 楊柳煤礦“三量”動態(tài)變化情況分析報告(3)
- 房屋買賣合同(維文)
- 漢語國際教育中語音偏誤及教學(xué)策略
評論
0/150
提交評論