如何利用Winsock控件编写自己的Internet程序
生活随笔
收集整理的這篇文章主要介紹了
如何利用Winsock控件编写自己的Internet程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
VB自帶的Winsock控件是一個非常強大的工具,利用它你可以在你的程序中使用各種Internet協(xié)議。如果你對網(wǎng)絡協(xié)議及計算機之間通信的原理有所了解的話,理論上講你可以編寫任何Internet程序。本文向你介紹如何使用Winsock控件以及如何通過它來使用幾乎所有的Internet協(xié)議,例如 HTTP (WWW), FTP, NNTP (News), SMTP和POP3 (Mail).
?????? 讓我們先來看看兩臺計算機通信的模型。一臺是客戶機,另一臺是服務器。
?????? 所有必需的軟件被裝在客戶端計算機上。客戶端計算機可以收發(fā)電子郵件信息,瀏覽WWW網(wǎng)頁,參加新聞組討論以及通過FTP從服務器上下載文件。這些軟件共存于一臺機中并相互影響。
?????? 另一種軟件被安裝在服務器上。這類軟件向遠程客戶端計算機提供服務。服務器可同時響應多個客戶計算機的服務請求。換句話說,服務器能在同一時間扮演幾個服務器的程序,如FTP服務器, WWW服務器和郵件服務器。
?????? 由于Socket技術,使得同時穩(wěn)定運行幾個Internet應用程序成為可能。Socket在MS Windows中的應用被稱為Windows Socket或干脆叫Winsock. Socket是一個程序設備,它允許你通過TCP/IP端口為某個網(wǎng)絡應用程序接收或發(fā)送數(shù)據(jù)。程序可按需要產(chǎn)生足夠數(shù)量的Socket,但是一個Socket必須對應一個TCP/IP端口。
?????? 客戶端計算機產(chǎn)生一個socket并隨機分配給它一個TCP/IP端口,該socket就利用這個端口來進行工作。但在服務器端,卻不是這樣做的。作為一條規(guī)則,服務器端的應用程序是用預先定義好的TCP/IP端口來工作。比如說:FTP服務器的端口號為21,WWW服務器的端口號為80. 下表列出了常用協(xié)議的默認端口號
協(xié)議 端口號 描述
SMTP 25 Simple Mail Transfer Protocol?
POP3 110 Post Office Protocol
NNTP 119 Network News Transfer Protocol
FTP 21 File Transfer Protocol
HTTP 80 Hyper Text Transfer Protocol??
?????? 客戶端計算機與服務器是通過其中一個網(wǎng)絡協(xié)議來開始網(wǎng)絡進程的。客戶機首先產(chǎn)生一個socket并利用它來同服務器建立連接。socket取得服務器的地址及要進行連接的端口號。對Winsock控件來講,你必須用它的Connect方法。下面這個代碼表示同一個FTP服務器進行連接。
Winsock1.Connect "ftp.microsoft.com", 21
?????? 正如你所見,該方法包括兩個參數(shù),第一個是遠程服務器的名稱或IP地址。第二個是端口號,它規(guī)定了你想從遠程服務器那里獲得哪種服務。在這里,21號端口是FTP服務器正在偵聽的端口號。所謂偵聽就是說服務器應用程序等待來自21號端口的客戶機的服務請求。如果連接成功,Winsock控件會產(chǎn)生一個Connect事件。
接下來的事件根據(jù)你使用的網(wǎng)絡協(xié)議不同而不同。
?????? 服務器等待你的命令 (HTTP) 據(jù)所使用的協(xié)議,服務器發(fā)送所要求的數(shù)據(jù)并斷開連接服務器向客戶端計算機發(fā)送歡迎信息及代碼(FTP, SMTP, POP3, NNTP),表示服務器現(xiàn)在等待接收你的命令服務器向客戶端計算機發(fā)送不能維持現(xiàn)有連接的消息及代碼(FTP, SMTP, POP3, NNTP) 在連接期間,服務器會向客戶端計算機發(fā)送消息,而我們要做的就是接收并處理這些消息。在Winsock控件中,主要通過其DataArrival事件來進行。
Dim strData As String
Winsock1.GetData strData
?????? 上面的最后一行代碼的作用是從緩沖中讀取服務器傳來的數(shù)據(jù)并儲存在strData變量中。然后你就可以根據(jù)需要處理信息了。
?????? 同服務器建立連接并從服務器處獲得第一條消息后,你就可以通過向服務器發(fā)送命令及等待其響應的形式同服務器進行通話了。下面是一個同MS FTP服務器進行通話的例子。
Client: Tries to make connection with ftp.microsoft.com (port 21)
Server: Accepts connection and sends first response to client
Server: 220 ftp Microsoft FTP Service (Version 3.0).
Client: USER anonymous
Server: 331 Anonymous access allowed, send identity (e-mail name) as password.
Client: PASS gdal@comset.net
Server: 230 Anonymous user logged in.
Client: CWD developr
Server: 250 CWD command successful.
???????
?????? 為了向服務器發(fā)送數(shù)據(jù),你需要用到SendData方法,下面是一個發(fā)送上面例子中第一條命令的例子:
Winsock1.SendData "USER anonymous" & vbCrLf
?????? 所有的命令,規(guī)則及命令順序都可在RFC (request for commants)文件中找到。
協(xié)議 RFC 地址
SMTP? 821 http://www.faqs.org/rfcs/rfc821.html
POP3? 1725 http://www.faqs.org/rfcs/rfc1725.html
NNTP 977 http://www.faqs.org/rfcs/rfc977.html
FTP? 959 http://www.faqs.org/rfcs/rfc959.html
HTTP? 2068 http://www.faqs.org/rfcs/rfc2068.html?
?????? 每個協(xié)議都有自己的一套命令及回應。盡管如此,你在開發(fā)程序時仍需遵循一些基本的規(guī)則。
?????? 命令是大小寫敏感的一些命令需要參數(shù),在命令與參數(shù)之間要留空格命令必須以vbCrLf結尾來自服務器的回應以字符和數(shù)字組成。附加的文本取決于服務器所用的軟件,但是數(shù)字代碼是常量。你要處理的就是這些數(shù)字。這些數(shù)字由三位數(shù)組成,服務器的回應以這三個數(shù)字開頭,因此用LEFT函數(shù)就可方便地截取這三個數(shù)字。例如:
strResponseCode = Left$(strServerResponse, 3).?
?????? 關于斷開連接。通常用QUIT命令來斷開同服務器的連接。發(fā)送了QUIT命令后,服務器會傳回最后一條消息并關閉連接。對于Winsock而言,會產(chǎn)生一個Close事件。
?????? 最后需要注意的一點是錯誤處理。你需要注意兩類錯誤。一類是應用的協(xié)議的錯誤,如果使用了不正確的命令就會產(chǎn)生這個錯誤,從服務器返回的消息代碼中可得知此類錯誤。另一類錯誤是Winsows Socket錯誤。對于這類錯誤,Winsock控件會產(chǎn)生一個Error事件。
?????? 如果你對該控件有足夠的認識的話,可看看Winsock Terminal示例程序,然后你就可以學習更復雜的協(xié)議了。
?????? 讓我們先來看看兩臺計算機通信的模型。一臺是客戶機,另一臺是服務器。
?????? 所有必需的軟件被裝在客戶端計算機上。客戶端計算機可以收發(fā)電子郵件信息,瀏覽WWW網(wǎng)頁,參加新聞組討論以及通過FTP從服務器上下載文件。這些軟件共存于一臺機中并相互影響。
?????? 另一種軟件被安裝在服務器上。這類軟件向遠程客戶端計算機提供服務。服務器可同時響應多個客戶計算機的服務請求。換句話說,服務器能在同一時間扮演幾個服務器的程序,如FTP服務器, WWW服務器和郵件服務器。
?????? 由于Socket技術,使得同時穩(wěn)定運行幾個Internet應用程序成為可能。Socket在MS Windows中的應用被稱為Windows Socket或干脆叫Winsock. Socket是一個程序設備,它允許你通過TCP/IP端口為某個網(wǎng)絡應用程序接收或發(fā)送數(shù)據(jù)。程序可按需要產(chǎn)生足夠數(shù)量的Socket,但是一個Socket必須對應一個TCP/IP端口。
?????? 客戶端計算機產(chǎn)生一個socket并隨機分配給它一個TCP/IP端口,該socket就利用這個端口來進行工作。但在服務器端,卻不是這樣做的。作為一條規(guī)則,服務器端的應用程序是用預先定義好的TCP/IP端口來工作。比如說:FTP服務器的端口號為21,WWW服務器的端口號為80. 下表列出了常用協(xié)議的默認端口號
協(xié)議 端口號 描述
SMTP 25 Simple Mail Transfer Protocol?
POP3 110 Post Office Protocol
NNTP 119 Network News Transfer Protocol
FTP 21 File Transfer Protocol
HTTP 80 Hyper Text Transfer Protocol??
?????? 客戶端計算機與服務器是通過其中一個網(wǎng)絡協(xié)議來開始網(wǎng)絡進程的。客戶機首先產(chǎn)生一個socket并利用它來同服務器建立連接。socket取得服務器的地址及要進行連接的端口號。對Winsock控件來講,你必須用它的Connect方法。下面這個代碼表示同一個FTP服務器進行連接。
Winsock1.Connect "ftp.microsoft.com", 21
?????? 正如你所見,該方法包括兩個參數(shù),第一個是遠程服務器的名稱或IP地址。第二個是端口號,它規(guī)定了你想從遠程服務器那里獲得哪種服務。在這里,21號端口是FTP服務器正在偵聽的端口號。所謂偵聽就是說服務器應用程序等待來自21號端口的客戶機的服務請求。如果連接成功,Winsock控件會產(chǎn)生一個Connect事件。
接下來的事件根據(jù)你使用的網(wǎng)絡協(xié)議不同而不同。
?????? 服務器等待你的命令 (HTTP) 據(jù)所使用的協(xié)議,服務器發(fā)送所要求的數(shù)據(jù)并斷開連接服務器向客戶端計算機發(fā)送歡迎信息及代碼(FTP, SMTP, POP3, NNTP),表示服務器現(xiàn)在等待接收你的命令服務器向客戶端計算機發(fā)送不能維持現(xiàn)有連接的消息及代碼(FTP, SMTP, POP3, NNTP) 在連接期間,服務器會向客戶端計算機發(fā)送消息,而我們要做的就是接收并處理這些消息。在Winsock控件中,主要通過其DataArrival事件來進行。
Dim strData As String
Winsock1.GetData strData
?????? 上面的最后一行代碼的作用是從緩沖中讀取服務器傳來的數(shù)據(jù)并儲存在strData變量中。然后你就可以根據(jù)需要處理信息了。
?????? 同服務器建立連接并從服務器處獲得第一條消息后,你就可以通過向服務器發(fā)送命令及等待其響應的形式同服務器進行通話了。下面是一個同MS FTP服務器進行通話的例子。
Client: Tries to make connection with ftp.microsoft.com (port 21)
Server: Accepts connection and sends first response to client
Server: 220 ftp Microsoft FTP Service (Version 3.0).
Client: USER anonymous
Server: 331 Anonymous access allowed, send identity (e-mail name) as password.
Client: PASS gdal@comset.net
Server: 230 Anonymous user logged in.
Client: CWD developr
Server: 250 CWD command successful.
???????
?????? 為了向服務器發(fā)送數(shù)據(jù),你需要用到SendData方法,下面是一個發(fā)送上面例子中第一條命令的例子:
Winsock1.SendData "USER anonymous" & vbCrLf
?????? 所有的命令,規(guī)則及命令順序都可在RFC (request for commants)文件中找到。
協(xié)議 RFC 地址
SMTP? 821 http://www.faqs.org/rfcs/rfc821.html
POP3? 1725 http://www.faqs.org/rfcs/rfc1725.html
NNTP 977 http://www.faqs.org/rfcs/rfc977.html
FTP? 959 http://www.faqs.org/rfcs/rfc959.html
HTTP? 2068 http://www.faqs.org/rfcs/rfc2068.html?
?????? 每個協(xié)議都有自己的一套命令及回應。盡管如此,你在開發(fā)程序時仍需遵循一些基本的規(guī)則。
?????? 命令是大小寫敏感的一些命令需要參數(shù),在命令與參數(shù)之間要留空格命令必須以vbCrLf結尾來自服務器的回應以字符和數(shù)字組成。附加的文本取決于服務器所用的軟件,但是數(shù)字代碼是常量。你要處理的就是這些數(shù)字。這些數(shù)字由三位數(shù)組成,服務器的回應以這三個數(shù)字開頭,因此用LEFT函數(shù)就可方便地截取這三個數(shù)字。例如:
strResponseCode = Left$(strServerResponse, 3).?
?????? 關于斷開連接。通常用QUIT命令來斷開同服務器的連接。發(fā)送了QUIT命令后,服務器會傳回最后一條消息并關閉連接。對于Winsock而言,會產(chǎn)生一個Close事件。
?????? 最后需要注意的一點是錯誤處理。你需要注意兩類錯誤。一類是應用的協(xié)議的錯誤,如果使用了不正確的命令就會產(chǎn)生這個錯誤,從服務器返回的消息代碼中可得知此類錯誤。另一類錯誤是Winsows Socket錯誤。對于這類錯誤,Winsock控件會產(chǎn)生一個Error事件。
?????? 如果你對該控件有足夠的認識的話,可看看Winsock Terminal示例程序,然后你就可以學習更復雜的協(xié)議了。
轉載于:https://www.cnblogs.com/Track/archive/2005/09/25/243767.html
總結
以上是生活随笔為你收集整理的如何利用Winsock控件编写自己的Internet程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新時代的開端:DELPHI.NET- 語
- 下一篇: 十二项测试