1 網(wǎng)絡(luò)管理系統(tǒng)的功能
用戶登錄認(rèn)證,電子郵件系統(tǒng),文件傳送,消息通知
2 Winsock控件介紹
Winsock 控件對(duì)用戶來說是不可見的,它提供了訪問 TCP 和 UDP 網(wǎng)絡(luò)服務(wù)的方便途徑。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的開發(fā)人員都可使用它。為編寫客戶或服務(wù)器應(yīng)用程序,不必了解 TCP 的細(xì)節(jié)或調(diào)用低級(jí)的 Winsock APIs。通過設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一臺(tái)遠(yuǎn)程機(jī)器上去,并且還可雙向交換數(shù)據(jù)。
如果創(chuàng)建客戶應(yīng)用程序,就必須知道服務(wù)器計(jì)算機(jī)名或者 IP 地址(RemoteHost 屬性),還要知道進(jìn)行“偵聽”的端口(RemotePort 屬性),然后調(diào)用 Connect 方法。如果創(chuàng)建服務(wù)器應(yīng)用程序,就應(yīng)設(shè)置一個(gè)收聽端口(LocalPort 屬性)并調(diào)用 Listen 方法。當(dāng)客戶計(jì)算機(jī)需要連接時(shí)就會(huì)發(fā)生 ConnectionRequest 事件。為了完成連接,可調(diào)用 ConnectionRequest 事件內(nèi)的 Accept 方法。
建立連接后,任何一方計(jì)算機(jī)都可以收發(fā)數(shù)據(jù)。為了發(fā)送數(shù)據(jù),可調(diào)用 SendData 方法。當(dāng)接收數(shù)據(jù)時(shí)會(huì)發(fā)生 DataArrival 事件。調(diào)用 DataArrival 事件內(nèi)的 GetData 方法就可獲取數(shù)據(jù)。
為實(shí)現(xiàn)Internet上兩個(gè)遠(yuǎn)程計(jì)算機(jī)之間的數(shù)據(jù)傳送,Winsock編程是一個(gè)十分便捷、快速的選擇。顯然,Winsock通信是基于Client/Server模式的,即服務(wù)器的Winsock在某端口進(jìn)行“偵聽”服務(wù),等待客戶機(jī)的申請(qǐng);那么如何實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間對(duì)等數(shù)據(jù)交換?實(shí)現(xiàn)中,可以把生成兩個(gè)Winsock對(duì)象,其中一個(gè)作為服務(wù)器對(duì)象在端口1“偵聽”,另外一個(gè)作為客戶機(jī)對(duì)象在端口2連接另一臺(tái)計(jì)算機(jī)——即每臺(tái)計(jì)算機(jī)可以作為服務(wù)器,也可以是客戶端。
VB6.0中,Winsock有兩種數(shù)據(jù)傳送格式:字符串型和字節(jié)流型;平時(shí)的信息交互可以使用字符串型,但由于文件的傳送要顧及各種格式的文件,因此文件不能以字符串進(jìn)行傳送,此時(shí)以字節(jié)流型數(shù)據(jù)傳送可以保證數(shù)據(jù)完整。
方法如下:
⑴如果是傳送字符串型,發(fā)送:Winsock1.SendData strData;接收:Winsock1.GetData strData(strData是字符串String型變量)。
⑵如果是傳送字節(jié)流型,發(fā)送:Winsock1.SendData strData();接收:Winsock1.GetData strData()(strData()是字節(jié)數(shù)組Dim strData() As BYTE)。
3 小型網(wǎng)絡(luò)管理系統(tǒng)的Winsock實(shí)現(xiàn)方法
3.1 Internet上的文件傳送實(shí)現(xiàn)方法
當(dāng)計(jì)算機(jī)A向計(jì)算機(jī)B之間要求文件(包括上傳和下載)傳送時(shí),首先向計(jì)算機(jī)B發(fā)送文件傳送請(qǐng)求——第一“握手”,之后才進(jìn)行真正的文件數(shù)據(jù)傳送。Winsock的SendData 方法發(fā)送的數(shù)據(jù)默認(rèn)數(shù)據(jù)文件數(shù)據(jù)傳送中,第一次握手:文件傳送(上傳,下載)請(qǐng)求數(shù)據(jù)格式:
操作類型 文件名 文件塊大小 文件塊數(shù)目 最后一塊大小(字節(jié))
0:上傳 當(dāng)?shù)匚募?1kb(默認(rèn)) 文件長(zhǎng)度/塊大小
1:申請(qǐng)下載 遠(yuǎn)程計(jì)算機(jī)中的文件名
第二次握手:文件傳送(上傳,下載)請(qǐng)求響應(yīng)操作及回復(fù)信息
上傳響應(yīng):發(fā)送OK,告訴對(duì)方可以開始傳送數(shù)據(jù)
下載響應(yīng):傳送文件塊數(shù)目+塊大小+最后一塊字節(jié)大小
之后,計(jì)算機(jī)之間進(jìn)入真正的文件數(shù)據(jù)傳送中,如圖(假定從A→B):
如此反復(fù),直至文件的數(shù)據(jù)塊傳送完畢,在傳送中間可以根據(jù)傳送塊的剩余數(shù)目顯示進(jìn)度條。
3.2 用戶登錄管理
⑴用戶登錄機(jī)制
為保證安全性,用戶登錄采用加密傳送用戶名及密碼,用戶登錄機(jī)制如下:
當(dāng)客戶機(jī)向服務(wù)器發(fā)出登錄請(qǐng)求時(shí),服務(wù)器生成相應(yīng)的Winsock對(duì)象接收(Accept)客戶機(jī)Winsock,從而建立服務(wù)器與不同的用戶之間的消息通道。
⑵Winsock服務(wù)器建立多客戶連接的方法:
首先在服務(wù)器中建立Winsock數(shù)組Winsock1(),其中Winsock(0)進(jìn)行“偵聽”,當(dāng)客戶機(jī)發(fā)出連接請(qǐng)求(clintWinsock.Connect 服務(wù)器IP地址,服務(wù)器偵聽端口)時(shí)Winsock(0)產(chǎn)生如下消息:
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then ´主Winsock——Winsock(0)發(fā)生消息
i = 1
While i <= cur And onl(i, 0) = 0 ´在以前的Winsock中找到空閑的Winsock
i = i + 1
Wend
If i <= cur Then ´在當(dāng)前裝載的Socket中發(fā)現(xiàn)有用戶已經(jīng)離開
Winsock1(i).LocalPort = 0 ´使用現(xiàn)成的Socket
Winsock1(i).Accept requestID ´接收
onl(i, 0) = 0 ´Winsock(i)被占用
Else ´在當(dāng)前裝載的Socket中沒發(fā)現(xiàn)有用戶離開
cur = cur + 1 ´當(dāng)前接收端口增加
Load Winsock1(cur) ´生成新的´ Winsock
Winsock1(cur).LocalPort = 0
Winsock1(cur).Accept requestID ´接收
onl(cur, 0) = 0 ´Winsock(cur)被占用
End If
End Sub
之后,服務(wù)器利用生成的Winsock(i)與第i個(gè)用戶通信。
用戶登錄認(rèn)證,電子郵件系統(tǒng),文件傳送,消息通知
2 Winsock控件介紹
Winsock 控件對(duì)用戶來說是不可見的,它提供了訪問 TCP 和 UDP 網(wǎng)絡(luò)服務(wù)的方便途徑。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的開發(fā)人員都可使用它。為編寫客戶或服務(wù)器應(yīng)用程序,不必了解 TCP 的細(xì)節(jié)或調(diào)用低級(jí)的 Winsock APIs。通過設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一臺(tái)遠(yuǎn)程機(jī)器上去,并且還可雙向交換數(shù)據(jù)。
如果創(chuàng)建客戶應(yīng)用程序,就必須知道服務(wù)器計(jì)算機(jī)名或者 IP 地址(RemoteHost 屬性),還要知道進(jìn)行“偵聽”的端口(RemotePort 屬性),然后調(diào)用 Connect 方法。如果創(chuàng)建服務(wù)器應(yīng)用程序,就應(yīng)設(shè)置一個(gè)收聽端口(LocalPort 屬性)并調(diào)用 Listen 方法。當(dāng)客戶計(jì)算機(jī)需要連接時(shí)就會(huì)發(fā)生 ConnectionRequest 事件。為了完成連接,可調(diào)用 ConnectionRequest 事件內(nèi)的 Accept 方法。
建立連接后,任何一方計(jì)算機(jī)都可以收發(fā)數(shù)據(jù)。為了發(fā)送數(shù)據(jù),可調(diào)用 SendData 方法。當(dāng)接收數(shù)據(jù)時(shí)會(huì)發(fā)生 DataArrival 事件。調(diào)用 DataArrival 事件內(nèi)的 GetData 方法就可獲取數(shù)據(jù)。
為實(shí)現(xiàn)Internet上兩個(gè)遠(yuǎn)程計(jì)算機(jī)之間的數(shù)據(jù)傳送,Winsock編程是一個(gè)十分便捷、快速的選擇。顯然,Winsock通信是基于Client/Server模式的,即服務(wù)器的Winsock在某端口進(jìn)行“偵聽”服務(wù),等待客戶機(jī)的申請(qǐng);那么如何實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間對(duì)等數(shù)據(jù)交換?實(shí)現(xiàn)中,可以把生成兩個(gè)Winsock對(duì)象,其中一個(gè)作為服務(wù)器對(duì)象在端口1“偵聽”,另外一個(gè)作為客戶機(jī)對(duì)象在端口2連接另一臺(tái)計(jì)算機(jī)——即每臺(tái)計(jì)算機(jī)可以作為服務(wù)器,也可以是客戶端。
VB6.0中,Winsock有兩種數(shù)據(jù)傳送格式:字符串型和字節(jié)流型;平時(shí)的信息交互可以使用字符串型,但由于文件的傳送要顧及各種格式的文件,因此文件不能以字符串進(jìn)行傳送,此時(shí)以字節(jié)流型數(shù)據(jù)傳送可以保證數(shù)據(jù)完整。
方法如下:
⑴如果是傳送字符串型,發(fā)送:Winsock1.SendData strData;接收:Winsock1.GetData strData(strData是字符串String型變量)。
⑵如果是傳送字節(jié)流型,發(fā)送:Winsock1.SendData strData();接收:Winsock1.GetData strData()(strData()是字節(jié)數(shù)組Dim strData() As BYTE)。
3 小型網(wǎng)絡(luò)管理系統(tǒng)的Winsock實(shí)現(xiàn)方法
3.1 Internet上的文件傳送實(shí)現(xiàn)方法
當(dāng)計(jì)算機(jī)A向計(jì)算機(jī)B之間要求文件(包括上傳和下載)傳送時(shí),首先向計(jì)算機(jī)B發(fā)送文件傳送請(qǐng)求——第一“握手”,之后才進(jìn)行真正的文件數(shù)據(jù)傳送。Winsock的SendData 方法發(fā)送的數(shù)據(jù)默認(rèn)數(shù)據(jù)文件數(shù)據(jù)傳送中,第一次握手:文件傳送(上傳,下載)請(qǐng)求數(shù)據(jù)格式:
操作類型 文件名 文件塊大小 文件塊數(shù)目 最后一塊大小(字節(jié))
0:上傳 當(dāng)?shù)匚募?1kb(默認(rèn)) 文件長(zhǎng)度/塊大小
1:申請(qǐng)下載 遠(yuǎn)程計(jì)算機(jī)中的文件名
第二次握手:文件傳送(上傳,下載)請(qǐng)求響應(yīng)操作及回復(fù)信息
上傳響應(yīng):發(fā)送OK,告訴對(duì)方可以開始傳送數(shù)據(jù)
下載響應(yīng):傳送文件塊數(shù)目+塊大小+最后一塊字節(jié)大小
之后,計(jì)算機(jī)之間進(jìn)入真正的文件數(shù)據(jù)傳送中,如圖(假定從A→B):
如此反復(fù),直至文件的數(shù)據(jù)塊傳送完畢,在傳送中間可以根據(jù)傳送塊的剩余數(shù)目顯示進(jìn)度條。
3.2 用戶登錄管理
⑴用戶登錄機(jī)制
為保證安全性,用戶登錄采用加密傳送用戶名及密碼,用戶登錄機(jī)制如下:
當(dāng)客戶機(jī)向服務(wù)器發(fā)出登錄請(qǐng)求時(shí),服務(wù)器生成相應(yīng)的Winsock對(duì)象接收(Accept)客戶機(jī)Winsock,從而建立服務(wù)器與不同的用戶之間的消息通道。
⑵Winsock服務(wù)器建立多客戶連接的方法:
首先在服務(wù)器中建立Winsock數(shù)組Winsock1(),其中Winsock(0)進(jìn)行“偵聽”,當(dāng)客戶機(jī)發(fā)出連接請(qǐng)求(clintWinsock.Connect 服務(wù)器IP地址,服務(wù)器偵聽端口)時(shí)Winsock(0)產(chǎn)生如下消息:
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then ´主Winsock——Winsock(0)發(fā)生消息
i = 1
While i <= cur And onl(i, 0) = 0 ´在以前的Winsock中找到空閑的Winsock
i = i + 1
Wend
If i <= cur Then ´在當(dāng)前裝載的Socket中發(fā)現(xiàn)有用戶已經(jīng)離開
Winsock1(i).LocalPort = 0 ´使用現(xiàn)成的Socket
Winsock1(i).Accept requestID ´接收
onl(i, 0) = 0 ´Winsock(i)被占用
Else ´在當(dāng)前裝載的Socket中沒發(fā)現(xiàn)有用戶離開
cur = cur + 1 ´當(dāng)前接收端口增加
Load Winsock1(cur) ´生成新的´ Winsock
Winsock1(cur).LocalPort = 0
Winsock1(cur).Accept requestID ´接收
onl(cur, 0) = 0 ´Winsock(cur)被占用
End If
End Sub
之后,服務(wù)器利用生成的Winsock(i)與第i個(gè)用戶通信。