Delphi的Socket編程要分幾步_第1頁
Delphi的Socket編程要分幾步_第2頁
Delphi的Socket編程要分幾步_第3頁
Delphi的Socket編程要分幾步_第4頁
Delphi的Socket編程要分幾步_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Delphi 的 Socket 編程要分幾步?ClientSocket 和 ServerSocket幾個(gè)重要的屬性:l.client 和 server 都有 port 屬性,需要一致才能互相通信2.client 有 Address 屬性,使用時(shí)填寫對(duì)方(server)的 IP 地址幾個(gè)重要的事件:client:OnRead 事件,當(dāng) client 收到消息時(shí)在 OnRead 事件中可以獲得 server 發(fā)送過來消息。Server:OnClientRead 事件,與上述 client 的作用相同發(fā)送信息:clien 使用 SocketClient1.Socket.SendBuf(char 類型

2、的數(shù)組,信息長(zhǎng)度);server 使用 SocketServer1.Socket.Connection0.SendBuf(char 類型的數(shù)組,信息長(zhǎng)度);接收信息clien 使用 SocketClient1.Socket.ReceiveBuf(char 類型的數(shù)組,信息長(zhǎng)度);server 使用 SocketServer1.Socket.Connection0.ReceiveBuf (char 類型的數(shù)組, 信息長(zhǎng)度) ;使用 sockets:Socket 控件讓你建立一個(gè)利用 TCP/IP 和有關(guān)的協(xié)議與其他系統(tǒng)進(jìn)行通信的應(yīng)用。使用 Sockets,你能夠讀和寫通過它連接的其他機(jī)器,而不用

3、擔(dān)心實(shí)際的網(wǎng)絡(luò)軟件的相關(guān)細(xì)節(jié)。Sockets提供基于 TCP/IP 協(xié)議的連接。Delphi 提供通過網(wǎng)絡(luò)服務(wù)器或客戶應(yīng)用程序去讀和寫其他的系統(tǒng)的功能。一個(gè)服務(wù)或客戶程序通常專注于一個(gè)單一的服務(wù),如超文本傳送協(xié)議(HTTP 或文件傳輸協(xié)議(FTP%使用 serversockets,一個(gè)應(yīng)用程序可以通過這些服務(wù)中的一個(gè)去連接一個(gè)希望使用服務(wù)的客戶程序。Clientsockets 允許一個(gè)應(yīng)用使用這些服務(wù)中的一個(gè)去連接提供這個(gè)服務(wù)的服務(wù)應(yīng)用。使用 sockets 去寫應(yīng)用程序,你必須理解下面這些知識(shí):一、服務(wù)工具當(dāng)你需要寫網(wǎng)絡(luò)服務(wù)或客戶應(yīng)用時(shí),Sockets 提供一種接合。對(duì)于許多服務(wù),象 HTT

4、P或 FTP,第三方服務(wù)商提供這些服務(wù)已經(jīng)相當(dāng)有效。有些甚至隨著操作系統(tǒng)捆綁而來,以便不用你自己寫。然而,當(dāng)你想更多的控制服務(wù)的實(shí)現(xiàn),比如想讓你的應(yīng)用程序與網(wǎng)絡(luò)通信更加緊密,或當(dāng)沒有一個(gè)服務(wù)能提供你特殊需要的服務(wù)時(shí),你可能想建立你自己的服務(wù)或客戶應(yīng)用。例如,工作在分布式 datasets 時(shí),你可能想為數(shù)據(jù)庫寫一層與其他系統(tǒng)通信的應(yīng)用。想使用 Sockets 實(shí)現(xiàn)一個(gè)服務(wù),你必須理解:1 .服務(wù)協(xié)議在你寫一個(gè)網(wǎng)絡(luò)服務(wù)或客戶程序前,你必須明白你的應(yīng)用將提供或使用什么服務(wù)。你的網(wǎng)絡(luò)應(yīng)用必須支持許多服務(wù)的標(biāo)準(zhǔn)協(xié)議。如果你為標(biāo)準(zhǔn)的服務(wù)例如 HTTPFTP 寫網(wǎng)絡(luò)應(yīng)用,你必須先理解與其他系統(tǒng)通信所使用的

5、協(xié)議。特殊服務(wù)細(xì)節(jié)你必須看提供的或使用的文檔。如果你的應(yīng)用程序提供一個(gè)新的服務(wù)與其他系統(tǒng)通信,第一步是為這個(gè)服務(wù)的服務(wù)端和客戶端設(shè)計(jì)通信協(xié)議。什么信息將發(fā)送?如何整理這些信息?如何對(duì)這些信息進(jìn)行編碼?應(yīng)用程序通信經(jīng)常的,你的網(wǎng)絡(luò)服務(wù)端或客戶端應(yīng)用程序要提供一層在網(wǎng)絡(luò)軟件和一個(gè)應(yīng)用之間使用的服務(wù)。例如,一個(gè) HTTP 服務(wù)站點(diǎn)在 internet 與一個(gè) Web 服務(wù)應(yīng)用之間為 HTTP 請(qǐng)求信息提供內(nèi)容和應(yīng)答。在你的網(wǎng)絡(luò)應(yīng)用(或客戶應(yīng)用)和網(wǎng)絡(luò)軟件之間 Sockets 提供一個(gè)接口。你必須提供一個(gè)接口,在你的應(yīng)用程序與應(yīng)用間使用。你可以拷貝第三方服務(wù)商提供的標(biāo)準(zhǔn) API(例如ISAPD,或你可

6、以設(shè)計(jì)和發(fā)布你自己的 API.2 .理解服務(wù)和端口許多標(biāo)準(zhǔn)服務(wù)都有關(guān)聯(lián)的、指定的端口號(hào)。當(dāng)執(zhí)行服務(wù)時(shí),你可以為服務(wù)考慮一個(gè)端口號(hào)。如果你實(shí)現(xiàn)一個(gè)標(biāo)準(zhǔn)服務(wù),Windowssocketobjects 提供一些方法讓你為服務(wù)尋找端口號(hào)。如果提供一個(gè)新的服務(wù),在基于 Windows95 或 NT 機(jī)器上,你能夠在文件 Services中為你的服務(wù)指定一個(gè)相關(guān)聯(lián)的端口號(hào)。設(shè)置 Services 文件的更多信息請(qǐng)看微軟的 WindowsSockets 文檔。二、Socket 連接的類型Socket 連接可以分成三個(gè)基本的類型,它們反映了如何開始連接和本地 Socket 連接是什么。這三個(gè)類型是:1 .客戶

7、端連接客戶端連接是一個(gè)本地系統(tǒng)的客戶端 socket 與一個(gè)遠(yuǎn)程系統(tǒng)上的服務(wù)端 Socket 連接??蛻舳诉B接由客戶端 Socket 開始。首先,客戶端 Socket 必須描述它想連接到的服務(wù)端Socket.接著客戶端 socket 查找服務(wù)端 socket,當(dāng)找到服務(wù)器時(shí),就要求連接。服務(wù)端 socket 可能不能完成正確的連接。服務(wù)器 sockets 維持一個(gè)客戶端請(qǐng)求隊(duì)列,在他們有時(shí)間時(shí)完成連接。當(dāng)服務(wù)端 socket 接受客戶端連接,服務(wù)端 socket 將向它想連接的客戶 socket 發(fā)送一個(gè)完整的描述,客戶端的連接完成。2 .監(jiān)聽連接服務(wù)器 socket 不會(huì)主動(dòng)去定位客戶端,他

8、們形成被動(dòng)的半連接狀態(tài),監(jiān)聽來自客戶端的請(qǐng)求。服務(wù)器 sockets 形成一個(gè)隊(duì)列,存放它們聽到的連接請(qǐng)求。這個(gè)隊(duì)列記錄著客戶端連接請(qǐng)求,就象他們已連接進(jìn)來一樣。當(dāng)服務(wù)器 sockets 同意客戶端連接請(qǐng)求時(shí),它將形成一個(gè)新的 socket 去連接客戶端,因此這個(gè)監(jiān)聽連接能保持開放狀態(tài)允許其他客戶端的連接請(qǐng)求。3 .服務(wù)端連接當(dāng)監(jiān)聽 socket 同意一個(gè)客戶端請(qǐng)求時(shí),服務(wù)器端 socket 形成一個(gè)服務(wù)器連接。當(dāng)服務(wù)器端同意連接時(shí),向客戶端發(fā)送一個(gè)服務(wù)端 socket 描述以完成連接,當(dāng)客戶端 socket收到這個(gè)描述時(shí)這個(gè)連接得到確認(rèn),連接完成。一但連接到客戶端的 Socket 完成,服務(wù)

9、端連接就不能識(shí)別從一個(gè)客戶端來的連接。末端雙方有同樣的能力去接收同樣的事件類型。只有監(jiān)聽(listening)連接是根本不同的,它只有一個(gè)單一的末端。三、sockets 描述Sockets 讓你的網(wǎng)絡(luò)應(yīng)用軟件通過網(wǎng)絡(luò)與其他系統(tǒng)進(jìn)行通信。在網(wǎng)絡(luò)連接中每個(gè) socket 可以看成一個(gè)終端點(diǎn)。它有一個(gè)指定的地址。*這個(gè)系統(tǒng)正在運(yùn)行*它理解的接口類型*用來連接的端口一個(gè)完整的 socket 連接描述,你必須提供 sockets 在連接兩端的地址。在你開始一個(gè) socket連接前,你必須完整的描述你想得到的連接。有些信息可以從你的應(yīng)用軟件運(yùn)行的系統(tǒng)平臺(tái)上得到。例如,你不需要描述一個(gè)客戶端 socket

10、的本地 IP 地址-這個(gè)信息可以從操作系統(tǒng)上獲得。你必須提供你工作所依靠的 socket 的類型的信息。客戶端 socket 必須描述他們想連接的服務(wù)器。監(jiān)聽服務(wù)器 sockets 必須描述他們提供反應(yīng)的服務(wù)器的端口。一個(gè)socket 連接終端的完整描述包括兩部分:1.1 P 地址主機(jī)是這樣一個(gè)系統(tǒng),它運(yùn)行著包含有 socket 的應(yīng)用程序。你必須描述主機(jī)給socket,通過給出主機(jī)的 IP 地址來完成這個(gè)描述。IP 地址是一個(gè)有四個(gè)數(shù)字(byte)值的,在 internet上使用的標(biāo)準(zhǔn)點(diǎn)分十進(jìn)制字符串。例如:一個(gè)簡(jiǎn)單的系統(tǒng)可以支持多于一個(gè)的 IP 地址。IP 地址通常難

11、于記憶并且容易打錯(cuò)。一個(gè)可供選擇的方法是使用主機(jī)名。主機(jī)名就是 IP 地址的別名,它就是你??吹降慕y(tǒng)一資源定位符(URL)它是一個(gè)字符串,包括了協(xié)議、服務(wù)和域名。例如 http:/許多內(nèi)部網(wǎng)提供給主機(jī)的名字對(duì)應(yīng)的系統(tǒng) IP 地址是 internet 的 IP 地址。在windows95 和 NT 機(jī)器上,如果一個(gè)主機(jī)名不能用,你可以在 HOSTS 文件中為你的本地 IP地址(這個(gè)本地 IP 地址應(yīng)該是指你想連接的主機(jī) IP 地址)建立一個(gè)進(jìn)入的名字。關(guān)于 HOST 成件的更多彳 t 息請(qǐng)看 WINDOWSSOCKETS 勺文檔。服務(wù)器 sockets 不需要指定主機(jī)。本地 IP 地址可以從系統(tǒng)

12、中讀到。如果本地系統(tǒng)支持多于一個(gè)的 IP 地址, 服務(wù)器 sockets 將同時(shí)在所有的 IP 地址上監(jiān)聽客戶端請(qǐng)求。 當(dāng)一個(gè)服務(wù)器 socket同意一個(gè)連接,客戶端提供一個(gè)遠(yuǎn)程 IP 地址??蛻舳?sockets 必須通過提供主機(jī)名或者 IP 地址來指定遠(yuǎn)程主機(jī)。在主機(jī)名和 IP 地址間作一個(gè)選擇許多應(yīng)用軟件使用一個(gè)主機(jī)名去指定一個(gè)系統(tǒng)。主機(jī)名容易記住并且容易檢查錯(cuò)誤。進(jìn)一步講,服務(wù)器能改變系統(tǒng)或與 IP 地址關(guān)聯(lián)的特殊的主機(jī)名。使用一個(gè)主機(jī)名,能夠允許客戶端通過主機(jī)名描述找到抽象的站點(diǎn),即使主機(jī)使用一個(gè)新的 IP 地址。如果主機(jī)名是未知的,客戶端 socket 必須指定服務(wù)器系統(tǒng)使用的 I

13、P 地址。通過給一個(gè) IP 地址來指定服務(wù)器將更快。當(dāng)你提供主機(jī)名時(shí),socket 在定位服務(wù)器系統(tǒng)前,必須搜尋與這個(gè)主機(jī)名相關(guān)的 IP 地址。2.端口號(hào)雖然 IP 地址提供了足夠的信息去找到 socket 連接中位于另一端的系統(tǒng),但你還必需要為 Socket 連接指定一個(gè)端口號(hào)。沒有端口號(hào),一個(gè)系統(tǒng)在同一時(shí)間只能進(jìn)行一個(gè)單一的連接。端口號(hào)是允許一個(gè)獨(dú)立系統(tǒng)同時(shí)支持多個(gè)主機(jī)連接的唯一標(biāo)識(shí),每個(gè)連接都必須指定個(gè)端口號(hào)。在網(wǎng)絡(luò)應(yīng)用中,對(duì)于服務(wù)器工具來說端口號(hào)是一個(gè)數(shù)字代碼。有一個(gè)習(xí)慣就是監(jiān)聽服務(wù)連接到他們自己固定的端口號(hào)上,以便他們能找到客戶端 sockets.服務(wù)器 socket 監(jiān)聽為他們提供

14、服務(wù)的相關(guān)端口號(hào)。當(dāng)他們?cè)试S給予一個(gè)客戶端 socket 連接時(shí),他們創(chuàng)建一個(gè)獨(dú)立的 socket 連接,使用不同的專用的端口號(hào)。通過這個(gè)方法,能持續(xù)的監(jiān)聽相關(guān)服務(wù)的端口號(hào)。客戶端 socket 使用一個(gè)專用的本地端口號(hào),就不用其他的 socket 去尋找它們。他們指定他們想連接的服務(wù)器端 socket 的端口號(hào),這樣他們就能找到服務(wù)器應(yīng)用程序。常常的,這個(gè)端口號(hào)是通過命名想連接的服務(wù)來間接指定的。四、使用 socket 控件Delphi 提供兩個(gè) socket 控件,客戶端 sockets 和服務(wù)器 sockets.他們?cè)试S你的網(wǎng)絡(luò)應(yīng)用構(gòu)成連接其他的機(jī)器和允許你通過這個(gè)連接來讀寫信息。與每個(gè)

15、 socket 控件相關(guān)聯(lián)的是windowssocket 對(duì)象,它們?cè)诮K端的的作用是一個(gè)實(shí)際的 socket 連接。socket 控件使用windowssocket 對(duì)象去封裝 windowssocketAPI 調(diào)用,所以你的應(yīng)用不用去關(guān)心連接建立的細(xì)節(jié)或管理socket 信息。如果你想利用 windowssocketAPI 調(diào)用或自定義連接細(xì)節(jié),socket 控件提供了便利,你可以使用 windowssocket 對(duì)象的 properies,events 和方法。.使用客戶端 sockets添加一個(gè)客戶端 socket 控件(TClientSocket)至 U 你的 form 或 datam

16、odule 使你的應(yīng)用成為一個(gè) TCP/IP 客戶??蛻舳?sockets 允許你指定你想連接的服務(wù)器 socket 和你希望服務(wù)器提供的服務(wù)。一但你描述你想得到的連接,你可以使用客戶端 socket 控件去完成連接服務(wù)。每個(gè)客戶端 socket 控件使用獨(dú)立的客戶端 windowssocket 對(duì)象(TClientWinSocket)去應(yīng)答連接中的客戶終端。使用客戶端 sockets 去:A.指定想得到的服務(wù)客戶端 socket 控件有一個(gè)數(shù)字 properties,允許你指定想連接的服務(wù)器系統(tǒng)和端口。你可以通過主機(jī)名來指定服務(wù)器系統(tǒng),使用 Hostpropertyo如果你不知道主機(jī)名,或者

17、你關(guān)心找到服務(wù)器的速度,你可以指定服務(wù)器系統(tǒng)的 IP地址,通過使用 Addresspropertyo你必須指定 IP 地址或主機(jī)名中的一個(gè)。如果你兩個(gè)都指定,客戶端 socket 控件將使用主機(jī)名。除服務(wù)器系統(tǒng)外,你必須指定你的客戶端 socket 將連接的在服務(wù)器系統(tǒng)上的端口。你能夠直接使用 Portproperty 來指定服務(wù)端口號(hào)。或者直接在 Serviceproperty 使用想得到的服務(wù)的名字。如果你指定端口號(hào)和服務(wù)名,客戶 socket 控件將使用服務(wù)名。.建立連接一旦你在客戶 socket 控件中完成了設(shè)置描述你想連接的服務(wù)器的屬性,你就可以進(jìn)行連接,通過調(diào)用 Open 方法。如

18、果你想你的應(yīng)用啟動(dòng)時(shí)自動(dòng)建立連接,在設(shè)計(jì)時(shí)設(shè)置 Activeproperty 為 true,通過使用 ObjectInspector 來設(shè)置。C 取得關(guān)于連接的信息完成連接到服務(wù)器 socket 后,你可以使用你的客戶 socket 控件相關(guān)的客戶 windowssocketobject 去取得關(guān)于連接的信息。使用 Socketproperty 去訪問 clientwindowssocketobject。windowssocketobject 有一個(gè) properties,它能讓你確定在連接的兩端客戶和服務(wù)器使用的地址和端口號(hào)。當(dāng)使用一個(gè) windowssocketAPI 調(diào)用時(shí),你可以使用

19、SocketHandleproperty 區(qū)獲得 socket 連接使用的 handle。你可以使用 Handleproperty 去訪問 windows,以便接收來自 socket 連接的信息。AsyncStylesproperty 決定哪種信息類型是 windowshandle 要接收的。D.關(guān)閉連接當(dāng)你完成通訊想關(guān)閉 socket 連接時(shí),你能夠通過調(diào)用 Close 方法來關(guān)閉連接。連接可能要由服務(wù)器端來關(guān)閉。如果是這種情況,你將收到一個(gè) OnDisconnect 事件的通知。2.使用服務(wù)器 sockets添加一個(gè)服務(wù)端 socket 控件 ServerSocket 到你的 form 或

20、 datamodule 使你的應(yīng)用成為一個(gè)TCP/IP 服務(wù)器。服務(wù)器 sockets 允許你指定你想提供的服務(wù)或你想用來監(jiān)聽客戶端請(qǐng)求時(shí)使用的端口。你可以使用服務(wù)器 socket 控件去監(jiān)聽和允許客戶連接請(qǐng)求。每個(gè)服務(wù)器 socket 控件使用一個(gè)單一的服務(wù)器 windowssocketObject(TServerWinSocket)去應(yīng)答在服務(wù)器端監(jiān)聽到的連接。 它通常使用一個(gè)服務(wù)器客戶 winodwssocketObject(TServerClientWinSocket)應(yīng)答在服務(wù)器端每個(gè)活動(dòng)的,連接著得到允許服務(wù)的客戶 socketo 使用服務(wù)器 sockets 去:A.指定端口在你的

21、服務(wù)器 socket 能夠監(jiān)聽客戶請(qǐng)求之前,你必須指定一個(gè)端口給你的監(jiān)聽服務(wù)。你可以使用 Portproperty 來指定這個(gè)端口。如果你的服務(wù)器應(yīng)用提供一個(gè)標(biāo)準(zhǔn)的服務(wù),這個(gè)服務(wù)使用一個(gè)習(xí)慣使用的相關(guān)聯(lián)的端口。你能夠使用 Serviceproperty 直接指定端口號(hào)。使用 Serviceproperty 是一個(gè)好的主意,能夠減少設(shè)置端口號(hào)時(shí)的錯(cuò)誤。如果你既指定了 Portproperty,又指定了 Serviceproperty,服務(wù) socket 將使用服務(wù)名。B.監(jiān)聽客戶請(qǐng)求一旦你在 serversocket 控件上設(shè)置好你的端口號(hào),你就能夠通過在運(yùn)行時(shí)調(diào)用 Open 方法來監(jiān)聽一個(gè)連接

22、。如果你希望你的應(yīng)用程序能夠在啟動(dòng)的時(shí)候自動(dòng)監(jiān)聽連接,在設(shè)計(jì)的時(shí)候通過使用 ObjectInspector 設(shè)置 Active 屬性為 true。C 連接到客戶端。當(dāng)服務(wù)端 socket 控件監(jiān)聽并接收到一個(gè)客戶端連接請(qǐng)求時(shí)他們將自動(dòng)接受這個(gè)請(qǐng)求。當(dāng)你每次收到通知時(shí),OnClientConnetc 事件將發(fā)生。D.取得關(guān)于連接的信息一但你的服務(wù)器 socket 打開了監(jiān)聽連接,你能夠使用與你的服務(wù)器 socket 控件相關(guān) 聯(lián) 的 服 務(wù) 器 windowssocketobject 來 取 得 關(guān) 于 連 接 的 信 息 。 使 用 Socketproperty 去 訪 問serverwind

23、owssocketobject。windowssocketobject 有個(gè)屬性能夠讓你找至 U 關(guān)于所有活動(dòng)的客戶socket 連接,這些客戶 socket 是你通過服務(wù)器 socket 控件允許連接的。使用 Handle屬性去存取 windows 通過 socket 連接收到的信息。每個(gè)活動(dòng)的,連接到客戶應(yīng)用是通過服務(wù)、客戶windowssocketbject(TServerClientWinSocket)封裝的。你能夠通過 serverwindowssocketobject 的連接屬性來訪問所有的這些。這些 serverclientwindowssocketobject 有些屬性讓你能夠

24、決定哪些地址和端口號(hào)給連接的兩端-客戶和服務(wù)器 socket 使用。當(dāng)你使用 windowssocketAPI 調(diào)用時(shí),可以使用SocketHandle 屬性去獲得 socket 連接使用的 handle。你能夠使用 Handle 屬性去訪問windows 從 socket 連接處得來的信息。AsyncStyles 屬性決定 windowshandle 將接收哪種類型的信息。E 關(guān)閉連接當(dāng)你決定關(guān)閉監(jiān)聽連接時(shí),調(diào)用 Close 方法。這將關(guān)閉所有打開著的,連接到客戶應(yīng)用的連接,取消任何尚未同意的連接,接著關(guān)閉監(jiān)聽連接以便你的服務(wù) socket 控件不在接受任何新的連接。當(dāng)客戶端關(guān)閉他們自己獨(dú)立

25、的連接到你的 serversocket 的連接時(shí),你可以在 OnClientDisconnect 事件中得到訊息。五、socket 事件的應(yīng)答當(dāng)使用 sockets 寫應(yīng)用程序時(shí),大多數(shù)工作發(fā)生在 socket 控件的 handler 事件中。當(dāng)通過 socket 連接開始讀或?qū)憰r(shí),OnRead 和 OnWrite 事件在 non-blockingclientsockets 中發(fā)生從而通知 sockets.同樣的,服務(wù)器 sockets(blockingornon-blocking)收到 OnClientRead 和 OnClientWrite 事件.當(dāng)服務(wù)器結(jié)束一個(gè)連接時(shí),客戶 scoket

26、s 收到一個(gè) OnDisconnect 事件.當(dāng)客戶端結(jié)束一個(gè)連接時(shí),服務(wù)器 socket 收到一個(gè) OnClientDisconnect 事件.另外,客戶端 Sockets 和服務(wù)器端 socket 從連接中收到一個(gè)錯(cuò)誤信息時(shí),都將產(chǎn)生一個(gè)錯(cuò)誤事件錯(cuò)誤事件:客戶 sockets 和服務(wù)器 sockets 通常會(huì)產(chǎn)生一個(gè) OnError 事件,當(dāng)他們從連接中收到一個(gè)錯(cuò)誤信息的時(shí)候.你能夠?qū)懸粋€(gè) OnError 事件處理去響應(yīng)這些錯(cuò)誤信息.這個(gè)OnError 事件處理提供傳送關(guān)于 socket 試圖做什么的時(shí)候這個(gè)錯(cuò)誤發(fā)生的信息,以及錯(cuò)誤信息提供的錯(cuò)誤代碼.你可以在 OnError 事件處理中對(duì)

27、這個(gè)錯(cuò)誤作出響應(yīng),并且把錯(cuò)誤代碼改為 0,以避免 socket 產(chǎn)生一個(gè)例外.當(dāng)開始和完成事件發(fā)生時(shí),socket 控件通常會(huì)收到一個(gè)事件號(hào)(numberofevents).如果你的應(yīng)用程序需要改變 socket 開始操作的處理過程或通過連接開始讀或?qū)懖僮鲿r(shí),你將寫事件 handlers 去應(yīng)答這些 clientevents 和 serverevents.A.clientevents當(dāng)一個(gè)客戶 socket 打開一個(gè)連接時(shí),以下事件發(fā)生:.一個(gè) OnLookup 事件最先發(fā)生,它試圖去定位 serversocket.在這里你不能改變Host,Address,Port,Service 屬 性 去

28、 改 變 你 想 定 位 的 服 務(wù) 器 . 你 能 夠 使 用 Socket 屬 性 去 訪 問clientwindowssocketobject,并且使用它的 SocketHandle 屬性去調(diào)用 windowsAPI,以便改變 socket 的客戶屬性.例如,如果你想在客戶應(yīng)用軟件中設(shè)置端口號(hào),你必須在 serverclient 連接前做這件事.windowssocket 設(shè)置和初始化事件通知.當(dāng)找到 serversocket 一個(gè) OnConnecting 事件發(fā)生.在這事件中,windowsSocketobject可以利用的是通過 socket 屬性提供關(guān)于連接的另一端的服務(wù) soc

29、ket 的一些信息.這是獲得實(shí)際使用來連接的端口和 IP 地址的第一個(gè)機(jī)會(huì),它可能不同于從監(jiān)聽 socket 處同意連接時(shí)得到的端口或 IP 地址.服務(wù)器同意連接請(qǐng)求,客戶端 socket 完成連接.當(dāng)一個(gè)連接得到確定后, 一個(gè) OnConnect 事件發(fā)生.如果你的 socket 立即開始通過連接讀或?qū)懀蛻?yīng)寫一個(gè) OnConnect 事件 Handler 去作這件事.e8a09208%561-Numbered_fcfe13e4-12ab-4e1f-936b-ced77.服務(wù)器端事件(serverevents)服務(wù)器 socket 控件通過兩種方式連接:監(jiān)聽連接和連接到客戶應(yīng)用.服務(wù)器 so

30、cket 收到這兩個(gè)連接的所有事件.監(jiān)聽時(shí)事件Delphi 的 Socket 編程要分幾步?當(dāng)構(gòu)成監(jiān)聽連接前,OnListen 事件發(fā)生.在這個(gè)時(shí)候你能夠通過 socket 屬性獲得serverwindowssocketobject.你能夠使用它的SocketHandle屬性去改變 socket,在socket打開監(jiān)聽之前.例如,如果你想限定監(jiān)聽服務(wù)使用的 IP 地址,你可以在這個(gè) OnListen 事件 Handler 中做.與客戶端連接的事件當(dāng)一個(gè)服務(wù)器 socket 同意一個(gè)客戶連接請(qǐng)求時(shí),接下來的事件發(fā)生:攙攙愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀攙開戀昀%25345 昀戀

31、昀 挀 戀攙 昀戀昀戀.服務(wù)器 socket 產(chǎn)生一個(gè) OnGetSocket 事件, 通過 windowssockethandle 傳送給連接的另一端的 socket.如果你想提供自己定義的 TServerClientWinSocketofdescendant,你可以在 OnGetSocket 事件 handler中建立,將被用來替代 TServerClientWinSocket.攙攙愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀攙開戀昀%25345 昀戀昀 挀 戀攙 昀戀昀戀.一個(gè) OnAccept 事件發(fā)生,傳送新的 TServerClientWinSocket 對(duì)象給事件句柄.這是

32、第一個(gè)要點(diǎn),當(dāng)你使用 TServerClientWinSocket 的屬性去獲得被連接中服務(wù)的那端的客戶的信息時(shí).攙攙愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀攙開戀昀%25345 昀戀昀 挀 戀攙 昀戀昀戀.如果服務(wù)類型是 stThreadBlocking,一個(gè) OnGetThread 事件發(fā)生。如果你想提供自己定義的TServerClientThread 子類,你可以在 OnGetThread 事件句柄中建立一個(gè),它將替代TServerClientThread.攙攙愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀攙開戀昀%25345 昀戀昀 挀 戀攙 昀戀昀戀.如果服務(wù)類型是 s

33、tThreadBlocking,一個(gè) OnThreadStart 事件發(fā)生。當(dāng)這個(gè)線程(thread)開始執(zhí)行時(shí).如果你想執(zhí)行任何初始化這個(gè)線程,或調(diào)用一些 windowssocketAPI 在這線程開始通過連接讀和寫之前,應(yīng)該使用 OnThreadStart 事件句柄.攙攙愀 愀攀愀 戀戀 戀昀戀攀愀攀攀昀 一甀洀戀攀爀攀攙開戀昀%25345 昀戀昀 挀 戀攙 昀戀昀戀.當(dāng)客戶端完成一個(gè)連接時(shí),一個(gè) OnClientConnect 事件發(fā)生.如果是 non-blocking 服務(wù),你可能想開始通過 socket 連接在這端進(jìn)行讀或?qū)懖僮?六、通過 Socket 連接進(jìn)行讀和寫通過 socke

34、t 連接到其他機(jī)器的原因是想通過這些連接來讀和寫信息.什么信息是你要讀和寫的,或者當(dāng)你想讀和寫時(shí)是依靠哪些 socket 連接的相關(guān)服務(wù)的.通過 sockets 進(jìn)行讀和寫可以是異步的,所以在你的網(wǎng)絡(luò)應(yīng)用中不需要阻塞其他代碼的執(zhí)行。這是調(diào)用 non-blockingconnection.你也同樣可以通過 blockingconnection,這時(shí)你的下一行代碼的執(zhí)行必須等到讀或?qū)懖僮魍瓿葾.Non-blocking連接,讀和寫是異步的,所以在你的網(wǎng)絡(luò)應(yīng)用中不需要阻塞其他代碼的執(zhí)行.建立一個(gè) Non-blocking 連接:.在客戶 socket 中設(shè)置 ClientType 屬性為 ctNon

35、Blocking.在服務(wù)器 socket 中設(shè)置 ServerType 屬性為 stNonBlocking.當(dāng)連接是 non-blocking 時(shí),連接的另一端企圖讀或?qū)憰r(shí)讀和寫事件將把這個(gè)信息通知你的socket.讀和寫操作事件Non-blockingsockets 想通過連接讀或?qū)憰r(shí),它會(huì)產(chǎn)生一個(gè)讀和寫操作事件通知你的 socket.在客戶端 sockets,你可以在 OnRead 或 OnWrite 事件句柄中對(duì)這些事件做出反應(yīng).在服務(wù)器端 Scokets,可以在 OnClientRead 或 OnClientWrite 事件句柄中對(duì)這些事件做出反應(yīng).與socket 連接相關(guān)聯(lián)的 win

36、dowssocketobject 在事件句柄的讀或?qū)懼斜划?dāng)作一個(gè)參數(shù).Windowssocketobject 提供一個(gè)方法號(hào)(numberofmethods)以允許你通過連接讀或?qū)?通過 socket 連接讀,使用 ReceiveBuf 或 ReceiveText 方法.在使用 ReceiveBuf 方法前,使用Receivelength 方法去確定在連接的另一端 socket 準(zhǔn)備發(fā)送白字節(jié)數(shù)(numberofbytes).通過 socket 連接寫,使用 SendBuf,SendStream 或 SendText 方法.如果你通過 socket 發(fā)送信息后不再需要 socket 連接, 你

37、可以使用 SendStreamThenDrop 方法.SendStreamThenDrop 在寫完所有的信息后將關(guān)閉 Socket 連接,它能夠從 stream 讀信息.如果你使用 SendStream 或SendStreamThenDrop 方法,不要釋放 Streamobject,socket 在連接結(jié)束后會(huì)自動(dòng)釋放這個(gè) Stream.注意:SendStreamThenDrop 將關(guān)閉一個(gè)獨(dú)立的客戶連接服務(wù),而不是監(jiān)聽連接.B.Blockingconnections當(dāng)你使用的連接是 Blocking 時(shí),你的 Socket 必須通過連接發(fā)起讀或?qū)懖僮?,勝過被動(dòng)的等待從 socket 連接發(fā)

38、來的通知.當(dāng)你的連接末端的讀和寫操作發(fā)生改變時(shí)使用 Blockingsocket.對(duì)于客戶端 sockets,設(shè)置 ClientType 屬性為 ctBlocking 以便構(gòu)成一個(gè)blocingconnection.根據(jù)你的客戶端應(yīng)用想完成什么,你可能想建立一個(gè)執(zhí)行線程去完成讀或?qū)懖僮?,以便你的?yīng)用能夠繼續(xù)執(zhí)行其他的線程,當(dāng)它在等待通過連接讀或?qū)懖僮鞯耐瓿?對(duì) 于 服 務(wù) 器 sockets, 設(shè) 置 ServerType 屬 性 為 stThreadBlocking 以 便 構(gòu) 成 一 個(gè)blockingconnection.因?yàn)閎lockingconnections在等待通過連接讀或?qū)懶畔?/p>

39、完成時(shí)掛起了其他代碼的執(zhí)行,服務(wù)器 socket 控件通常產(chǎn)生一個(gè)新的執(zhí)行線程給每一個(gè)客戶連接,當(dāng) ServerType 設(shè)置為stThreadBlocking 時(shí).許多使用 Blocking 連接的應(yīng)用都寫使用線程(usingthreads.甚至如果你不使用線程你可能也想使用 TWinSocketStream 去讀和寫.1)usingthreads當(dāng)使用一個(gè) blockingconnection 進(jìn)行讀或?qū)懖僮鲿r(shí),客戶 sockets 不會(huì)自動(dòng)產(chǎn)生一個(gè)新線程.如果你的客戶應(yīng)用程序沒有什么事做,直到讀或?qū)懶畔⑼瓿?,那么這正是你想要的.如果你的應(yīng)用包括了一個(gè)用戶界面,它還需要響應(yīng)用戶的操作,那么,你可能想產(chǎn)生一個(gè)獨(dú)立的線程去讀寫.當(dāng)服務(wù)器 sockets 形成一個(gè) blocking 連接時(shí),他們常常產(chǎn)生獨(dú)立的線程給每一個(gè)客戶連接,所以沒有客戶需要等待直到其他客戶完成通過連接讀或?qū)懖僮?在默認(rèn),f#況下,服務(wù)器 sockets 使用 TS

溫馨提示

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

評(píng)論

0/150

提交評(píng)論