如何利用Winsock控件编写自己的Internet程序
生活随笔
收集整理的這篇文章主要介紹了
如何利用Winsock控件编写自己的Internet程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VB自帶的Winsock控件是一個(gè)非常強(qiáng)大的工具,利用它你可以在你的程序中使用各種Internet協(xié)議。如果你對網(wǎng)絡(luò)協(xié)議及計(jì)算機(jī)之間通信的原理有所了解的話,理論上講你可以編寫任何Internet程序。本文向你介紹如何使用Winsock控件以及如何通過它來使用幾乎所有的Internet協(xié)議,例如 HTTP (WWW), FTP, NNTP (News), SMTP和POP3 (Mail).
?????? 讓我們先來看看兩臺計(jì)算機(jī)通信的模型。一臺是客戶機(jī),另一臺是服務(wù)器。
?????? 所有必需的軟件被裝在客戶端計(jì)算機(jī)上。客戶端計(jì)算機(jī)可以收發(fā)電子郵件信息,瀏覽WWW網(wǎng)頁,參加新聞組討論以及通過FTP從服務(wù)器上下載文件。這些軟件共存于一臺機(jī)中并相互影響。
?????? 另一種軟件被安裝在服務(wù)器上。這類軟件向遠(yuǎn)程客戶端計(jì)算機(jī)提供服務(wù)。服務(wù)器可同時(shí)響應(yīng)多個(gè)客戶計(jì)算機(jī)的服務(wù)請求。換句話說,服務(wù)器能在同一時(shí)間扮演幾個(gè)服務(wù)器的程序,如FTP服務(wù)器, WWW服務(wù)器和郵件服務(wù)器。
?????? 由于Socket技術(shù),使得同時(shí)穩(wěn)定運(yùn)行幾個(gè)Internet應(yīng)用程序成為可能。Socket在MS Windows中的應(yīng)用被稱為Windows Socket或干脆叫Winsock. Socket是一個(gè)程序設(shè)備,它允許你通過TCP/IP端口為某個(gè)網(wǎng)絡(luò)應(yīng)用程序接收或發(fā)送數(shù)據(jù)。程序可按需要產(chǎn)生足夠數(shù)量的Socket,但是一個(gè)Socket必須對應(yīng)一個(gè)TCP/IP端口。
?????? 客戶端計(jì)算機(jī)產(chǎn)生一個(gè)socket并隨機(jī)分配給它一個(gè)TCP/IP端口,該socket就利用這個(gè)端口來進(jìn)行工作。但在服務(wù)器端,卻不是這樣做的。作為一條規(guī)則,服務(wù)器端的應(yīng)用程序是用預(yù)先定義好的TCP/IP端口來工作。比如說:FTP服務(wù)器的端口號為21,WWW服務(wù)器的端口號為80. 下表列出了常用協(xié)議的默認(rèn)端口號
協(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??
?????? 客戶端計(jì)算機(jī)與服務(wù)器是通過其中一個(gè)網(wǎng)絡(luò)協(xié)議來開始網(wǎng)絡(luò)進(jìn)程的。客戶機(jī)首先產(chǎn)生一個(gè)socket并利用它來同服務(wù)器建立連接。socket取得服務(wù)器的地址及要進(jìn)行連接的端口號。對Winsock控件來講,你必須用它的Connect方法。下面這個(gè)代碼表示同一個(gè)FTP服務(wù)器進(jìn)行連接。
Winsock1.Connect "ftp.microsoft.com", 21
?????? 正如你所見,該方法包括兩個(gè)參數(shù),第一個(gè)是遠(yuǎn)程服務(wù)器的名稱或IP地址。第二個(gè)是端口號,它規(guī)定了你想從遠(yuǎn)程服務(wù)器那里獲得哪種服務(wù)。在這里,21號端口是FTP服務(wù)器正在偵聽的端口號。所謂偵聽就是說服務(wù)器應(yīng)用程序等待來自21號端口的客戶機(jī)的服務(wù)請求。如果連接成功,Winsock控件會產(chǎn)生一個(gè)Connect事件。
接下來的事件根據(jù)你使用的網(wǎng)絡(luò)協(xié)議不同而不同。
?????? 服務(wù)器等待你的命令 (HTTP) 據(jù)所使用的協(xié)議,服務(wù)器發(fā)送所要求的數(shù)據(jù)并斷開連接服務(wù)器向客戶端計(jì)算機(jī)發(fā)送歡迎信息及代碼(FTP, SMTP, POP3, NNTP),表示服務(wù)器現(xiàn)在等待接收你的命令服務(wù)器向客戶端計(jì)算機(jī)發(fā)送不能維持現(xiàn)有連接的消息及代碼(FTP, SMTP, POP3, NNTP) 在連接期間,服務(wù)器會向客戶端計(jì)算機(jī)發(fā)送消息,而我們要做的就是接收并處理這些消息。在Winsock控件中,主要通過其DataArrival事件來進(jìn)行。
Dim strData As String
Winsock1.GetData strData
?????? 上面的最后一行代碼的作用是從緩沖中讀取服務(wù)器傳來的數(shù)據(jù)并儲存在strData變量中。然后你就可以根據(jù)需要處理信息了。
?????? 同服務(wù)器建立連接并從服務(wù)器處獲得第一條消息后,你就可以通過向服務(wù)器發(fā)送命令及等待其響應(yīng)的形式同服務(wù)器進(jìn)行通話了。下面是一個(gè)同MS FTP服務(wù)器進(jìn)行通話的例子。
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.
???????
?????? 為了向服務(wù)器發(fā)送數(shù)據(jù),你需要用到SendData方法,下面是一個(gè)發(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?
?????? 每個(gè)協(xié)議都有自己的一套命令及回應(yīng)。盡管如此,你在開發(fā)程序時(shí)仍需遵循一些基本的規(guī)則。
?????? 命令是大小寫敏感的一些命令需要參數(shù),在命令與參數(shù)之間要留空格命令必須以vbCrLf結(jié)尾來自服務(wù)器的回應(yīng)以字符和數(shù)字組成。附加的文本取決于服務(wù)器所用的軟件,但是數(shù)字代碼是常量。你要處理的就是這些數(shù)字。這些數(shù)字由三位數(shù)組成,服務(wù)器的回應(yīng)以這三個(gè)數(shù)字開頭,因此用LEFT函數(shù)就可方便地截取這三個(gè)數(shù)字。例如:
strResponseCode = Left$(strServerResponse, 3).?
?????? 關(guān)于斷開連接。通常用QUIT命令來斷開同服務(wù)器的連接。發(fā)送了QUIT命令后,服務(wù)器會傳回最后一條消息并關(guān)閉連接。對于Winsock而言,會產(chǎn)生一個(gè)Close事件。
?????? 最后需要注意的一點(diǎn)是錯(cuò)誤處理。你需要注意兩類錯(cuò)誤。一類是應(yīng)用的協(xié)議的錯(cuò)誤,如果使用了不正確的命令就會產(chǎn)生這個(gè)錯(cuò)誤,從服務(wù)器返回的消息代碼中可得知此類錯(cuò)誤。另一類錯(cuò)誤是Winsows Socket錯(cuò)誤。對于這類錯(cuò)誤,Winsock控件會產(chǎn)生一個(gè)Error事件。
?????? 如果你對該控件有足夠的認(rèn)識的話,可看看Winsock Terminal示例程序,然后你就可以學(xué)習(xí)更復(fù)雜的協(xié)議了。
?????? 讓我們先來看看兩臺計(jì)算機(jī)通信的模型。一臺是客戶機(jī),另一臺是服務(wù)器。
?????? 所有必需的軟件被裝在客戶端計(jì)算機(jī)上。客戶端計(jì)算機(jī)可以收發(fā)電子郵件信息,瀏覽WWW網(wǎng)頁,參加新聞組討論以及通過FTP從服務(wù)器上下載文件。這些軟件共存于一臺機(jī)中并相互影響。
?????? 另一種軟件被安裝在服務(wù)器上。這類軟件向遠(yuǎn)程客戶端計(jì)算機(jī)提供服務(wù)。服務(wù)器可同時(shí)響應(yīng)多個(gè)客戶計(jì)算機(jī)的服務(wù)請求。換句話說,服務(wù)器能在同一時(shí)間扮演幾個(gè)服務(wù)器的程序,如FTP服務(wù)器, WWW服務(wù)器和郵件服務(wù)器。
?????? 由于Socket技術(shù),使得同時(shí)穩(wěn)定運(yùn)行幾個(gè)Internet應(yīng)用程序成為可能。Socket在MS Windows中的應(yīng)用被稱為Windows Socket或干脆叫Winsock. Socket是一個(gè)程序設(shè)備,它允許你通過TCP/IP端口為某個(gè)網(wǎng)絡(luò)應(yīng)用程序接收或發(fā)送數(shù)據(jù)。程序可按需要產(chǎn)生足夠數(shù)量的Socket,但是一個(gè)Socket必須對應(yīng)一個(gè)TCP/IP端口。
?????? 客戶端計(jì)算機(jī)產(chǎn)生一個(gè)socket并隨機(jī)分配給它一個(gè)TCP/IP端口,該socket就利用這個(gè)端口來進(jìn)行工作。但在服務(wù)器端,卻不是這樣做的。作為一條規(guī)則,服務(wù)器端的應(yīng)用程序是用預(yù)先定義好的TCP/IP端口來工作。比如說:FTP服務(wù)器的端口號為21,WWW服務(wù)器的端口號為80. 下表列出了常用協(xié)議的默認(rèn)端口號
協(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??
?????? 客戶端計(jì)算機(jī)與服務(wù)器是通過其中一個(gè)網(wǎng)絡(luò)協(xié)議來開始網(wǎng)絡(luò)進(jìn)程的。客戶機(jī)首先產(chǎn)生一個(gè)socket并利用它來同服務(wù)器建立連接。socket取得服務(wù)器的地址及要進(jìn)行連接的端口號。對Winsock控件來講,你必須用它的Connect方法。下面這個(gè)代碼表示同一個(gè)FTP服務(wù)器進(jìn)行連接。
Winsock1.Connect "ftp.microsoft.com", 21
?????? 正如你所見,該方法包括兩個(gè)參數(shù),第一個(gè)是遠(yuǎn)程服務(wù)器的名稱或IP地址。第二個(gè)是端口號,它規(guī)定了你想從遠(yuǎn)程服務(wù)器那里獲得哪種服務(wù)。在這里,21號端口是FTP服務(wù)器正在偵聽的端口號。所謂偵聽就是說服務(wù)器應(yīng)用程序等待來自21號端口的客戶機(jī)的服務(wù)請求。如果連接成功,Winsock控件會產(chǎn)生一個(gè)Connect事件。
接下來的事件根據(jù)你使用的網(wǎng)絡(luò)協(xié)議不同而不同。
?????? 服務(wù)器等待你的命令 (HTTP) 據(jù)所使用的協(xié)議,服務(wù)器發(fā)送所要求的數(shù)據(jù)并斷開連接服務(wù)器向客戶端計(jì)算機(jī)發(fā)送歡迎信息及代碼(FTP, SMTP, POP3, NNTP),表示服務(wù)器現(xiàn)在等待接收你的命令服務(wù)器向客戶端計(jì)算機(jī)發(fā)送不能維持現(xiàn)有連接的消息及代碼(FTP, SMTP, POP3, NNTP) 在連接期間,服務(wù)器會向客戶端計(jì)算機(jī)發(fā)送消息,而我們要做的就是接收并處理這些消息。在Winsock控件中,主要通過其DataArrival事件來進(jìn)行。
Dim strData As String
Winsock1.GetData strData
?????? 上面的最后一行代碼的作用是從緩沖中讀取服務(wù)器傳來的數(shù)據(jù)并儲存在strData變量中。然后你就可以根據(jù)需要處理信息了。
?????? 同服務(wù)器建立連接并從服務(wù)器處獲得第一條消息后,你就可以通過向服務(wù)器發(fā)送命令及等待其響應(yīng)的形式同服務(wù)器進(jìn)行通話了。下面是一個(gè)同MS FTP服務(wù)器進(jìn)行通話的例子。
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.
???????
?????? 為了向服務(wù)器發(fā)送數(shù)據(jù),你需要用到SendData方法,下面是一個(gè)發(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?
?????? 每個(gè)協(xié)議都有自己的一套命令及回應(yīng)。盡管如此,你在開發(fā)程序時(shí)仍需遵循一些基本的規(guī)則。
?????? 命令是大小寫敏感的一些命令需要參數(shù),在命令與參數(shù)之間要留空格命令必須以vbCrLf結(jié)尾來自服務(wù)器的回應(yīng)以字符和數(shù)字組成。附加的文本取決于服務(wù)器所用的軟件,但是數(shù)字代碼是常量。你要處理的就是這些數(shù)字。這些數(shù)字由三位數(shù)組成,服務(wù)器的回應(yīng)以這三個(gè)數(shù)字開頭,因此用LEFT函數(shù)就可方便地截取這三個(gè)數(shù)字。例如:
strResponseCode = Left$(strServerResponse, 3).?
?????? 關(guān)于斷開連接。通常用QUIT命令來斷開同服務(wù)器的連接。發(fā)送了QUIT命令后,服務(wù)器會傳回最后一條消息并關(guān)閉連接。對于Winsock而言,會產(chǎn)生一個(gè)Close事件。
?????? 最后需要注意的一點(diǎn)是錯(cuò)誤處理。你需要注意兩類錯(cuò)誤。一類是應(yīng)用的協(xié)議的錯(cuò)誤,如果使用了不正確的命令就會產(chǎn)生這個(gè)錯(cuò)誤,從服務(wù)器返回的消息代碼中可得知此類錯(cuò)誤。另一類錯(cuò)誤是Winsows Socket錯(cuò)誤。對于這類錯(cuò)誤,Winsock控件會產(chǎn)生一個(gè)Error事件。
?????? 如果你對該控件有足夠的認(rèn)識的話,可看看Winsock Terminal示例程序,然后你就可以學(xué)習(xí)更復(fù)雜的協(xié)議了。
轉(zhuǎn)載于:https://www.cnblogs.com/Track/archive/2005/09/25/243767.html
總結(jié)
以上是生活随笔為你收集整理的如何利用Winsock控件编写自己的Internet程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新時代的開端:DELPHI.NET- 語
- 下一篇: 十二项测试