ClientSocket 和ServerSocket 幾個重要的屬性: 1.client和server都有port屬性,須要一致才能互相通訊 2.client有Address屬性,使用時填寫對方(server)的IP地址 幾個重要的事件: client: OnRead事件,當client受到衝擊消息時在OnRead事件中能夠得到server發送過來消息。 Server: OnClientRead事件,與上述client的做用相同 發送信息: clien使用SocketClient1.Socket.SendBuf(char類型的數組,信息長度); server使用SocketServer1.Socket.Connection[0].SendBuf(char類型的數組,信息長度); 接收信息 clien使用SocketClient1.Socket.ReceiveBuf(char類型的數組,信息度); server使用SocketServer1.Socket.Connection[0].ReceiveBuf(char類型的數組,信息長度);
編程 使用sockets Socket 控件讓你創建一個利用TCP/IP和有關的協議與其餘系統進行通訊的應用。使用Sockets,你可以讀和寫經過它鏈接的其餘機器,而不用擔憂實際的網絡軟件的相關細節。Sockets提供基於TCP/IP協議的鏈接。除此之外還能很好的工做,在其餘相關的協議。 Delphi 提供你寫網絡服務器或客戶應用程序去讀和寫其餘的系統。一個服務或客戶程序一般專一於一個單一的服務如超文本傳送協議(HTTP)或文件傳輸協議(FTP)。使用server sockets,一個應用程序能夠提供這些服務中的一個去鏈接一個但願使用服務的客戶程序。Client sockets容許一個應用使用這些服務中的一個去鏈接提供這個服務的服務應用。 使用sockets去寫應用程序,你必須理解下面這些知識: 1、服務工具 當你須要寫網絡服務或客戶應用時,Sockets提供一種接合。對於許多服務,象HTTP 或 FTP,第三方服務商提供這些服務已經至關有效。有些甚至隨着操做系統捆綁而來,以便不用你本身寫。然而,當你想更多的控制服務的實現,如想讓你的應用程序與網絡通訊更加緊密,或當沒有一個服務能提供你特殊須要的服務時,你可能想創建你本身的服務或客戶應用。例如,工做在分佈式data sets時,你可能想爲數據庫寫一層與其餘系統通訊的應用。想使用Sockets實現一個服務,你必須理解: 1.服務協議 在你寫一個網絡服務或客戶程序前,你必須明白你的應用將提供或使用什麼服務。你的網絡應用必須支持許多服務的標準協議。若是你爲標準的服務例如HTTP,FTP寫網絡應用,你必須先理解與其餘系統通訊所使用的協議。特殊服務細節你必須看提供的或使用的文檔。 若是你的應用程序提供一個新的服務與其餘系統通訊,第一步是爲這個服務的服務端和客戶端設計通訊協議。什麼信息將發送?如何整理這些信息?如何對這些信息進行編碼? 應用程序通訊 常常的,你的網絡服務端或客戶端應用程序要提供一層在網絡軟件和一個應用之間使用的服務。例如,一個HTTP服務站點在INternet與一個Web 服務應用之間爲HTTP請求信息提供內容和應答。 在你的網絡應用(或客戶應用)和網絡軟件之間Sockets 提供一個接口。你必須提供一個接口,在你的應用程序與應用間使用。你能夠拷貝第三方服務商提供的標準API(例如ISAPI),或你能夠設計和發佈你本身的API. 2.理解服務和端口 許多標準服務都有關聯的、指定的端口號。當執行服務時,你能夠爲服務考慮一個端口號。若是你實現一個標準服務,Windows socket objects 提供一些方法讓你爲服務尋找端口號。若是提供一個新的服務,在基於Windows 95 或 NT機器上,你可以在文件Services中爲你的服務指定一個相關聯的端口號。設置Services文件的更多信息請看微軟的Windows Sockets文檔。 2、Socket鏈接的類型 Socket鏈接能夠分紅三個基本的類型,它們反映瞭如何開始鏈接和本地Socket 鏈接是什麼。這三個類型是: 1.客戶端鏈接 客戶端鏈接是一個本地系統的客戶端socket與一個遠程系統上的服務端Socket鏈接。客戶端鏈接由客戶端Socket開始。首先,客戶端Socket必須描述它想鏈接到的服務端Socket. 接着客戶端socket查×××端socket,當找到服務器時,就要求鏈接。服務端socket可能不能完成正確的鏈接。服務器sockets維持一個客戶端請求隊列,在他們有時間時完成鏈接。當服務端socket接受客戶端鏈接,服務端socket將向它想鏈接的客戶socket發送一個完整的描述,客戶端的鏈接完成。 2.傾聽鏈接 服務器 socket不會去定位客戶端,代替的,他們造成被動的,"半鏈接"狀態,傾聽來自客戶端的請求。服務器 sockets造成一個隊列,存放它們聽到的鏈接請求。這個隊列記錄着客戶端鏈接請求就象他們已鏈接進來同樣。當服務器sockets贊成客戶鏈接請求時,它造成一個新的socket去鏈接客戶端,所以這個傾聽鏈接能保持開放狀態容許其餘客戶端請求。 3.服務端鏈接 當傾聽socket贊成一個客戶端請求時,服務器端socket造成一個服務器鏈接。當服務器端贊成鏈接時,向客戶端發送一個服務端socket描述以完成鏈接,當客戶端socket收到這個描述時這個鏈接獲得確認,鏈接完成。一但鏈接到客戶端的Socket完成,服務端鏈接就不能識別從一個客戶端來的鏈接。末端雙方有一樣的能力去接收一樣的事件類型。只有傾聽(listening)鏈接是根本不一樣的,它只有一個單一的末端。
windows 3、sockets描述 Sockets讓你的網絡應用軟件經過網絡與其餘系統進行通訊。在網絡鏈接中每一個socket能夠當作一個終端點。它有一個指定的地址。 *這個系統正在運行 *它理解的接口類型 *用來鏈接的端口 一個完整的socket鏈接描述,你必須提供sockets 在鏈接兩端的地址。在你開始一個socket鏈接前,你必須完整的描述你想獲得的鏈接。有些信息能夠從你的應用軟件運行的系統平臺上獲得。例如,你不須要描述一個客戶端socket的本地IP地址--這個信息能夠從操做系統上得到。你必須提供你工做所依靠的socket的類型的信息。客戶端socket必須描述他們想鏈接的服務器。偵聽服務器sockets必須描述他們提供反應的服務器的端口。一個socket 鏈接終端的完整描述包括兩部分: 1.IP地址 主機是這樣一個系統,它運行着包含有socket的應用程序。你必須描述主機給socket,經過給出主機的IP地址來完成這個描述。IP地址是一個有四個數字(byte)值的,在標準internet點付內的字符串。 例如123.197.1.2 一個簡單的系統能夠支持多於一個的IP地址。IP地址一般難於記憶而且容易打錯。一個可供選擇的方法是使用主機名。主機名就是IP地址的別名,它就是你常看到的統一資源定位(URLs)。它是一個字符串,包括了域名和服務。 例如 http://www.wsite.com 許多內部網提供給主機的名字對應的系統IP地址是internetIP地址。在windows95 和NT機器上,若是一個主機名不能用,你能夠在HOSTS文件中爲你的本地IP地址(這個本地IP地址應該是指你想鏈接的主機IP地址--zyqsj)創建一個進入的名字。 關於HOSTS文件的更多信息請看WINDOWS SOCKETS的文檔。 服務器sockets不須要指定主機。本地IP地址能夠從系統中讀到。若是本地系統支持多於一個的IP地址,服務器sockets將同時在全部的IP地址上偵聽客戶端請求。當一個服務器socket贊成一個鏈接,客戶端提供一個遠程IP地址。客戶sockets必須指定遠程主機經過提供主機名或者IP地址。 在主機名和IP地址間做一個選擇 許多應用軟件使用一個主機名去指定一個系統。主機名容易記住和容易檢查排版錯誤。進一步講,服務器能改變系統或與IP地址關聯的特殊的主機名。使用一個主機名,可以容許客戶端經過主機名描述找到抽象的站點,即便主機使用一個新的IP地址。 若是主機名是未知的,客戶socket必須指定服務器系統使用的IP地址。經過給一個IP地址來指定服務器將更快。當你提供主機名時,socket在定位服務器系統前,必須搜尋與這個主機名相關的IP地址。 2.端口號 雖然IP得地址提供了足夠的信息去找到socket鏈接中位於另外一端的系統,你一般還須要指定那個系統的端口號。沒有端口號,一個系統在同一時間只能進行一個單一的鏈接。端口號是惟一標識那容許一個獨立系統鏈接到支持同時多個鏈接的主機,每一個鏈接都必須指定一個端口號。 在網絡應用中,對於服務器工具來講端口號是一個數字代碼。有一個習慣就是偵聽服務鏈接到他們本身固定的端口號上,以便他們能找到客戶端sockets.服務器socket監聽爲他們提供服務的相關端口號。當他們容許給予一個客戶端socket鏈接時,他們建立一個獨立的socket鏈接,使用不一樣的專用的端口號。經過這個方法,能持續的監聽相關服務的端口號。 客戶端socket使用一個專用的本地端口號,就不用其餘的socket去尋找它們。他們指定他們想鏈接的服務器端socket的端口號,這樣他們就能找到服務器應用程序。經常的,這個端口號是經過命名想鏈接的服務來間接指定的。 4、使用socket控件 Delphi提供兩個socket控件,客戶端sockets和服務器sockets.他們容許你的網絡應用構成鏈接其餘的機器和容許你經過這個鏈接來讀寫信息。與每一個socket控件相關聯的是windows socket對象,它們在終端的的做用是一個實際的socket鏈接。socket控件使用windows socket對象去封裝windows socket API 調用,因此你的應用不用去關心鏈接創建的細節或管理socket信息。 若是你想利用windows socket API調用或自定義鏈接細節,socket控件提供了便利,你可使用windows socket對象的properies,events和方法。 1.使用客戶端sockets 添加一個客戶端socket控件(TClientSocket)到你的form或data module 使你的應用成爲一個TCP/IP客戶。客戶sockets容許你指定你想鏈接的服務器socket和你但願服務器提供的服務。一但你描述你想獲得的鏈接,你可使用客戶socket控件去完成鏈接服務。 每一個客戶socket控件使用獨立的客戶windows socket對象(TClientWinSocket)去應答鏈接中的客戶終端。使用客戶sockets去: A.指定想獲得的服務 客戶socket控件有一個數字properties,容許你指定想鏈接的服務器系統和端口。你能夠經過主機名來指定服務器系統,使用Host property。 若是你不知道主機名,或者你關心找到服務器的速度,你能夠指定服務器系統的IP地址,經過使用 Address property。你必須指定IP地址和主機名中的一個。 若是你兩個都指定,客戶socket控件將使用主機名。除服務器系統外,你必須指定你的客戶socket將鏈接的在服務器系統上的端口。你可以直接使用Port property來指定服務端口號。或者直接在Service property使用想獲得的服務的名字。若是你指定端口號和服務名,客戶socket控件將使用服務名。 B.創建鏈接 一旦你在客戶socket控件中完成了設置描述你想鏈接的服務器的屬性,你就能夠進行鏈接,經過調用Open方法。若是你想你的應用啓動時自動創建鏈接,在設計時設置Active property爲true,經過使用Object Inspector來設置。 C.取得關於鏈接的信息 完成鏈接到服務器socket後,你可使用與你的客戶socket控件相關的客戶windows socket object去取得關於鏈接的信息。使用Socket property去訪問client windows socket object。
數組 windows socket object 有一個properties,它能讓你肯定在鏈接的兩端客戶和服務器使用的地址和端口號。 當使用一個windows socket API 調用時,你可使用SocketHandle property區得到socket鏈接使用的handle。你可使用Handle property去訪問windows,以便接收來自socket鏈接的信息。 AsyncStyles property決定哪一種信息類型是windows handle要接收的。 D.關閉鏈接 當你完成通信想關閉socket 鏈接時,你可以經過調用Close方法來關閉鏈接。鏈接可能要由服務器端來關閉。若是是這種狀況,你將收到一個OnDisconnect 事件的通知。 2.使用服務器sockets 添加一個服務端socket控件ServerSocket 到你的form或data module使你的應用成爲一個TCP/IP服務器。服務器sockets容許你指定你想提供的服務或你想用來監聽客戶請求時使用的端口。你可使用服務器socket控件去監聽和容許客戶鏈接請求。每一個服務器socket控件使用一個單一的服務器windows socket Object(TServerWinSocket)去應答在服務器端監聽到的鏈接。它一般使用一個服務器客戶winodws socket Object(TServerClientWinSocket)應答在服務器端每一個活動的,鏈接着獲得容許服務的客戶socket。使用服務器sockets去: A.指定端口 在你的服務器socket可以監聽客戶請求以前,你必須指定一個端口給你的監聽服務。你可使用Port property來指定這個端口。若是你的服務器應用提供一個標準的服務,這個服務使用一個習慣使用的相關聯的端口。你可以使用Service property直接指定端口號。使用Service property是一個好的主意,可以減小設置端口號時的錯誤。若是你既指定了Port property,又指定了Service property,服務socket將使用服務名。 B.監聽客戶請求 一旦你在server socket控件上設置好你的端口號,你就可以經過在運行時經過調用Open方法來監聽一個鏈接。若是你但願你的應用程序可以在啓動的時候自動監聽鏈接,在設計的時候經過使用Object Inspector設置Active 屬性爲true。 C.鏈接到客戶端。 當監聽服務socket控件接收到一個客戶端鏈接請求時他們將自動接受這個請求。當你沒次收到通知時,OnClientConnetc事件將發生。 D.取得關於鏈接的信息 一但你的服務器socket打開了監聽鏈接,你可以使用與你服務器socket控件相關聯的服務器windows socket object來取得關於鏈接的信息。使用Socket property去訪問server windows socket object。windows socket object有一個屬性可以讓你找到關於全部活動的客戶socket鏈接這些客戶socket是你經過服務器socket控件容許鏈接的。使用Handle屬性去存取windows經過socket鏈接收到的信息。 每一個活動的,鏈接到客戶應用是經過服務、客戶windows socket bject (TServerClientWinSocket)封裝的。你可以經過server windows socket object的鏈接屬性來訪問全部的這些。這些server client windows socket object有些屬性讓你可以決定哪些地址和端口號給鏈接的兩端--客戶和服務器socket使用。當你使用windows socket API調用時,可使用SocketHandle屬性去得到socket鏈接使用的handle。你可以使用Handle屬性去訪問windows從socket鏈接處得來的信息。AsyncStyles屬性決定windows handle將接收哪一種類型的信息。 E.關閉鏈接 當你決定關閉監聽鏈接時,調用Close方法。這將關閉全部打開着的,鏈接到客戶應用的鏈接,取消任何還沒有贊成的鏈接,接着關閉監聽鏈接以便你的服務socket控件不在接受任何新的鏈接。當客戶端關閉他們本身獨立的鏈接到你的server socket的鏈接時,你能夠在OnClientDisconnect事件中獲得訊息。 5、socket事件的應答 當使用sockets寫應用程序時,大多數工做發生在socket控件的handler事件中。當經過socket鏈接開始讀或寫時,OnRead和OnWrite事件在non-blocking client sockets中發生從而通知sockets.一樣的,服務器sockets(blocking or non-blocking)收到OnClientRead和OnClientWrite事件. 當服務器結束一個鏈接時,客戶scokets收到一個OnDisconnect事件.當客戶端結束一個鏈接時,服務器socket收到一個OnClientDisconnect事件. 另外,客戶端Sockets和服務器端socket從鏈接中收到一個錯誤信息時,都將產生有個錯誤事件. 錯誤事件:客戶sockets和服務器sockets一般會產生一個OnError事件,當他們從鏈接中收到一個錯誤信息的時候.你可以寫一個OnError事件處理去響應這些錯誤信息.這個OnError事件處理提供傳送關於socket試圖作什麼的時候這個錯誤發生的信息,以及錯誤信息提供的錯誤代碼.你能夠在OnError事件處理中對這個錯誤做出響應,而且把錯誤代碼改成0,以免socket產生一個例外. 當開始和完成發生時,socket控件一般會收到一個事件號(number of events).若是你的應用程序須要改變socket開始操做的處理過程或經過鏈接開始讀或寫操做時,你將寫事件handlers去應答這些client events和server events. A.client events 當一個客戶socket打開一個鏈接時,如下事件發生: 1.一個OnLookup事件最早發生,它試圖去定位server socket.在這裏你不能改變Host,Address,Port,Service屬性去改變你想定位的服務器.你可以使用Socket屬性去訪問client windows socket object,而且使用它的SocketHandle屬性去調用windows API,以便改變socket的客戶屬性.例如,若是你想在客戶應用軟件中設置端口號,你必須在server client鏈接前作這件事. 2.windows socket設置和初始化事件通知. 3.當找到server socket 一個OnConnecting事件發生.在這事件中,windows Socket object能夠利用的是經過socket屬性提供關於鏈接的另外一端的服務socket的一些信息.這是得到實際使用來鏈接的端口和IP地址的第一個機會,它可能不一樣於從監聽socket處贊成鏈接時獲得的端口或IP地址. 4.服務器贊成鏈接請求,客戶端socket完成鏈接. 5.當一個鏈接獲得肯定後,一個OnConnect事件發生.若是你的socket當即開始經過鏈接讀或寫,就應寫一個OnConnect事件Handler去做這件事. B.服務器端事件(server events) 服務器socket控件經過兩中方式鏈接:監聽鏈接和鏈接到客戶應用.服務器socket收到這兩個鏈接的全部事件. 監聽時事件 當構成監聽鏈接前,OnListen事件發生.在這個時候你可以經過socket屬性得到server windows socket object.你可以使用它的SocketHandle屬性去改變socket,在socket打開監聽以前.例如,若是你想限定監聽服務使用的IP地址,你能夠在這個OnListen事件Handler中作. 與客戶端鏈接的事件 當一個服務器socket贊成一個客戶鏈接請求時,接下來的事件發生: 1.服務器socket產生一個OnGetSocket事件,經過windows socket handle傳送給鏈接的另外一端的socket.若是你想提供本身定義的TServerClientWinSocket of descendant,你能夠在OnGetSocket 事件 handler中創建,將被用來替代TServerClientWinSocket.
緩存 2.一個OnAccept事件發生,傳送新的TServerClientWinSocket對象給事件句柄.這是第一個要點,當你使用TServerClientWinSocket的屬性去得到被鏈接中服務的那端的客戶的信息時.
安全 3.若是服務類型是stThreadBlocking,一個OnGetThread事件發生。若是你想提供本身定義的TServerClientThread子類,你能夠在OnGetThread事件句柄中創建一個,它將替代TServerClientThread. 4.若是服務類型是stThreadBlocking,一個ONThreadStart事件發生。當這個線程(thread)開始執行時.若是你想執行任何初始化這個線程,或調用一些windows socket API在這線程開始經過鏈接讀和寫以前,應該使用OnThreadStart事件句柄.
服務器 5.當客戶端完成一個鏈接時,一個OnClientConnect事件發生.若是是non-blocking服務,你可能想開始經過socket鏈接在這端進行讀或寫操做. 6、經過Socket 鏈接進行讀和寫 經過socket鏈接到其餘機器的緣由是想經過這些鏈接來讀和寫信息.什麼信息是你要讀和寫的,或者當你想讀和寫時是依靠哪些socket鏈接的相關服務的. 經過sockets進行讀和寫能夠是異步的,因此在你的網絡應用中不須要阻塞其餘代碼的執行。這是調用non-blocking connection.你也一樣能夠經過blocking connection,這時你的下一行代碼的執行必須等到讀或寫操做完成. A.Non-blocking 鏈接,讀和寫是異步的, 因此在你的網絡應用中不須要阻塞其餘代碼的執行.創建一個Non-blocking鏈接: 1.在客戶socket中設置ClientType屬性爲ctNonBlocking. 2.在服務器socket中設置ServerType屬性爲stNonBlocking. 當鏈接是non-blocking時,鏈接的另外一端企圖讀或寫時讀和寫事件將把這個信息通知你的socket. 讀和寫操做事件 Non-blocking sockets想經過鏈接讀或寫時,它會產生一個讀和寫操做事件通知你的socket.在客戶端sockets,你能夠在OnRead或OnWrite事件句柄中對這些事件作出反應.在服務器端Scokets,能夠在OnClientRead或OnClientWrite事件句柄中對這些事件作出反應.與socket鏈接相關聯的windows socket object在事件句柄的讀或寫中被看成一個參數.Windows socket object提供一個方法號(number of methods)以容許你經過鏈接讀或寫.
網絡 經過socket鏈接讀,使用ReceiveBuf或ReceiveText方法.在使用ReceiveBuf方法前,使用Receivelength方法去肯定在鏈接的另外一端socket準備發送的字節數(number of bytes). 經過socket鏈接寫,使用SendBuf,SendStream,或SendText方法.若是你經過socket發送信息後不在須要socket鏈接,你可使用SendStreamThenDrop方法. SendStreamThenDrop在寫完全部的信息後將關閉Socket鏈接,它可以從stream讀信息.若是你使用SendStream或SendStreamThenDrop方法,不要釋放Stream object, socket在鏈接結束後會自動釋放這個Stream. 注意:SendStreamThenDrop將關閉一個獨立的客戶鏈接服務,而不是監聽鏈接. B.Blocking connections 當你使用的鏈接是Blocking時,你的Socket必須經過鏈接發起讀或寫操做,賽過被動的等待從socket鏈接發來的通知. 當你的鏈接末端的讀和寫操做發生改變時 使用Blocking socket.對於客戶端sockets,設置ClientType屬性爲ctBlocking 以便構成一個blocing connection.根據你的客戶端應用想完成什麼,你可能想創建一個執行線程去完成讀或寫操做,以便你的應用可以繼續執行其餘的線程,當它在等待經過鏈接讀或寫操做的完成. 對於服務器sockets,設置ServerType屬性爲stThreadBlocking 以便構成一個blocking connection.由於blocking connections在等待經過鏈接讀或寫信息完成時掛起了其餘代碼的執行,服務器socket控件一般產生一個新的執行線程給每個客戶鏈接,當ServerType設置爲stThreadBlocking時.許多使用Blocking鏈接的應用都寫使用線程(using threads.甚至若是你不使用線程,你可能也想使用 TWinSocketStream 去讀和寫. 1)using threads 當使用一個blocking connection進行讀或寫操做時,客戶sockets不會自動產生一個新線程.若是你的客戶應用程序沒有什麼事作,直到讀或寫信息完成,那麼這正是你想要的.若是你的應用包括了一個用戶界面,它還須要響應用戶的操做,那麼,你可能想產生一個獨立的線程去讀寫.當服務器sockets造成一個blocking鏈接時,他們經常產生獨立的線程給每個客戶鏈接,因此沒有客戶須要等待直到其餘客戶完成經過鏈接讀或寫操做.在默認狀況下,服務器sockets使用TServerClientThread對象去實現爲每一個鏈接執行不一樣的線程. TServerClientThread對象模擬發生在non-blocking鏈接中的OnClientRead和OnClientWrite事件.但是,這些事件發生在監聽socket上時,不是本地線程(thread-local).若是客戶請求頻繁,你將想創建你本身的TServerClientThread子類去提供一個安全線程(Thread-Safe)去完成讀和寫操做. 當寫客戶線程或寫服務器線程時,你可以使用TwinSocketStream去作實際的讀寫操做. A)寫客戶端線程 爲客戶端鏈接寫一個線程,定義一個新線程對象,使用新線程對象對話框.你的新線程對象Execute方法的句柄的經過線程鏈接進行讀寫操做的細節,能夠創建一個TWinSocketStream對象,而後使用它來讀或寫. 使用你本身的線程,在OnConnect事件句柄中創建它.關於創建和運行線程的更多信息,請看Executing thread objects. B)寫服務器線程 服務器鏈接線程由TServerClientThread派生.由於這個,不能使用新線程對象對話框替代的. 注意你將用重載ClientExcute方法替代Execute方法.執行ClientExecute方法必須爲客戶端鏈接寫一個一樣的Execute方法線程.然而,當你從控件欄上放一個客戶socket控件到你的應用上時來替代這個方法時.監聽服務socket贊成一個鏈接時,服務客戶線程必須使用TServerClientWinSocket對象來創建.這能夠利用共公共的CientSocket屬性.另外,你可以使用HandleException這個protected性的方法,賽過 你本身寫你的thread-safe例外操做. 警告:Server sockets會緩存他們使用到的線程.確信ClientExecute方法執行一些必要的初始化操做,以便它們在最後執行時不致於產生不利的結果. 當你使用你的線程時,在OnGetThread事件句柄中創建它.當創建線程,設置CreateSuspended參數爲false. C.使用TwinSocketStream 當爲一個blocking鏈接實現一個線程時,你必須肯定在鏈接的另外一端的socket是準備寫仍是讀.Blocking鏈接不會通知socket當它準備好寫或讀操做的時候.想看看鏈接是否準備好,使用TWinSocketStream對象.TWinSocketStream提供一個方法去幫助調整讀或寫操做時間的選擇.調用WaitForData方法去等待,直到socket另外一端的準備好寫操做.當讀寫操做使用TWinSocketStream時,若是讀或寫操做在指定的時間期限內未能完成,Stream將發生超時.這個超時被看成一個結果,socket應用不會暫停,而是不斷的經過一個dropped connection試圖讀或寫. 異步 |