用Winsock控件在VFP中進(jìn)行網(wǎng)絡(luò)編程的資料卻非常少,尤其是利用此控件在VFP中進(jìn)行非文本文件的傳輸,更是一大難題:VFP中沒有二進(jìn)制類型的變量定義。筆者經(jīng)過長(zhǎng)時(shí)間的摸索,掌握了一些有關(guān)這方面的編程經(jīng)驗(yàn),現(xiàn)加以總結(jié),以便和廣大的VFP愛好者共同探討:
一、編程基礎(chǔ)
因?yàn)橛嘘P(guān)Winsock控件的資料在很多媒體上都有相關(guān)介紹,因此為了節(jié)省篇幅,我就不再作具體介紹,請(qǐng)大家查找一下有關(guān)資料即可,這里我只簡(jiǎn)單說一下要用到的一些設(shè)置。為了保證通訊的可靠性,在下面的程序中使用的是TCP/IP協(xié)議,并且在客戶端和服務(wù)端均采用預(yù)設(shè)端口1001(大家在實(shí)踐時(shí)可以自行更改)。
二、界面設(shè)計(jì)
1.客戶端:界面中共有7個(gè)對(duì)象,屬性Name=TcpClient,RemoteHostport=1001,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
2.服務(wù)端:共有5個(gè)對(duì)象,屬性Name=TcpServer,LocalHostport=1001,此屬性務(wù)必和客戶端的遠(yuǎn)程主機(jī)端口一致,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
三、實(shí)現(xiàn)代碼
1.客戶端
■表單的 Init 事件:
public strDatastrData = ""
thisform.tcpClient.RemoteHost = "192.41.242.18"
thisform.tcpClient.RemotePort = 1001
■"連接"按鈕.Click 事件
thisform.tcpClient.object.Connect("192.41.242.18",1001)
this.Enabled = .f.
■TcpClient.DataArrive 事件
*** ActiveX Control Event ***LPARAMETERS
bytestotalthisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服務(wù)端
■表單的 Init 事件:
public strDatastrData = ""
thisform.tcpServer.Object.LocalPort = 1001thisform.tcpServer.Object.Listen ■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
end if
thisform.tcpServer.OBJECT.Accept(requestID)
常數(shù) 值 說明
sckclosed 0 關(guān)閉(默認(rèn))
sckopen 1 打開
scklistening 2 偵聽
sckconnected 7 已連接
sckerror 9 姓了錯(cuò)誤
■TcpServer.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSendData.InteractiveChange 事件
thisform.tcpServer.Object.SendData(this.Value)
現(xiàn)在我們就可以運(yùn)行了,看看怎么樣,既可以在同一臺(tái)機(jī)器上運(yùn)行,也可以在局域網(wǎng)上運(yùn)行。 注意
一定要在Winsock對(duì)象代碼中加入VFP的關(guān)鍵字OBJECT,否則是不可能成功的(我也是在無數(shù)次失敗后才得到的答案)。
四、擴(kuò)展及其它
以上我們簡(jiǎn)單實(shí)現(xiàn)了使用Winsock控件的點(diǎn)對(duì)點(diǎn)通信程序,界面比較簡(jiǎn)單,功能也相對(duì)較少,讀者可據(jù)此進(jìn)行擴(kuò)充。下面我再說說有關(guān)文件傳輸?shù)膯栴}。
在上面的程序中,已經(jīng)能夠進(jìn)行實(shí)時(shí)點(diǎn)對(duì)點(diǎn)通信,但要用此進(jìn)行文件傳輸,還有一大難題需要解決。因?yàn)閂FP并不提供二進(jìn)制類型的變量定義,因此要向進(jìn)行文件的傳輸,必須解決ASCII碼大于128的字符傳送問題。不過在VFP6.0版本中,提供了filetostr()和strtofile()文件與內(nèi)存變量的轉(zhuǎn)換函數(shù),不過在具體的運(yùn)行中,我發(fā)現(xiàn)利用這兩個(gè)函數(shù)只能傳送不大于8K字節(jié)的文件,并且要求是文本類型才可以。因此,我們不能采用此中解決辦法,還好,VFP6.0提供了二個(gè)非常有用的字節(jié)處理函數(shù)bintoc()和ctobin(),其中bintoc()函數(shù)是將長(zhǎng)整型數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的4個(gè)字節(jié)字符(默認(rèn)值,可改動(dòng)),ctobin()函數(shù)則相反,有關(guān)的詳細(xì)資料請(qǐng)參閱VFP幫助。這樣我們就可以利用這兩個(gè)函數(shù)來進(jìn)行文件的傳輸了。有了上面的基礎(chǔ),想必該怎么編寫代碼你也該會(huì)了(只需在Winsock對(duì)象的DataArrive事件中加入一些代碼即可),我就不詳述了。
一、編程基礎(chǔ)
因?yàn)橛嘘P(guān)Winsock控件的資料在很多媒體上都有相關(guān)介紹,因此為了節(jié)省篇幅,我就不再作具體介紹,請(qǐng)大家查找一下有關(guān)資料即可,這里我只簡(jiǎn)單說一下要用到的一些設(shè)置。為了保證通訊的可靠性,在下面的程序中使用的是TCP/IP協(xié)議,并且在客戶端和服務(wù)端均采用預(yù)設(shè)端口1001(大家在實(shí)踐時(shí)可以自行更改)。
二、界面設(shè)計(jì)
1.客戶端:界面中共有7個(gè)對(duì)象,屬性Name=TcpClient,RemoteHostport=1001,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
2.服務(wù)端:共有5個(gè)對(duì)象,屬性Name=TcpServer,LocalHostport=1001,此屬性務(wù)必和客戶端的遠(yuǎn)程主機(jī)端口一致,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
三、實(shí)現(xiàn)代碼
1.客戶端
■表單的 Init 事件:
public strDatastrData = ""
thisform.tcpClient.RemoteHost = "192.41.242.18"
thisform.tcpClient.RemotePort = 1001
■"連接"按鈕.Click 事件
thisform.tcpClient.object.Connect("192.41.242.18",1001)
this.Enabled = .f.
■TcpClient.DataArrive 事件
*** ActiveX Control Event ***LPARAMETERS
bytestotalthisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服務(wù)端
■表單的 Init 事件:
public strDatastrData = ""
thisform.tcpServer.Object.LocalPort = 1001thisform.tcpServer.Object.Listen ■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
end if
thisform.tcpServer.OBJECT.Accept(requestID)
常數(shù) 值 說明
sckclosed 0 關(guān)閉(默認(rèn))
sckopen 1 打開
scklistening 2 偵聽
sckconnected 7 已連接
sckerror 9 姓了錯(cuò)誤
■TcpServer.DataArrive 事件
*** ActiveX Control Event ***
LPARAMETERS bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSendData.InteractiveChange 事件
thisform.tcpServer.Object.SendData(this.Value)
現(xiàn)在我們就可以運(yùn)行了,看看怎么樣,既可以在同一臺(tái)機(jī)器上運(yùn)行,也可以在局域網(wǎng)上運(yùn)行。 注意
一定要在Winsock對(duì)象代碼中加入VFP的關(guān)鍵字OBJECT,否則是不可能成功的(我也是在無數(shù)次失敗后才得到的答案)。
四、擴(kuò)展及其它
以上我們簡(jiǎn)單實(shí)現(xiàn)了使用Winsock控件的點(diǎn)對(duì)點(diǎn)通信程序,界面比較簡(jiǎn)單,功能也相對(duì)較少,讀者可據(jù)此進(jìn)行擴(kuò)充。下面我再說說有關(guān)文件傳輸?shù)膯栴}。
在上面的程序中,已經(jīng)能夠進(jìn)行實(shí)時(shí)點(diǎn)對(duì)點(diǎn)通信,但要用此進(jìn)行文件傳輸,還有一大難題需要解決。因?yàn)閂FP并不提供二進(jìn)制類型的變量定義,因此要向進(jìn)行文件的傳輸,必須解決ASCII碼大于128的字符傳送問題。不過在VFP6.0版本中,提供了filetostr()和strtofile()文件與內(nèi)存變量的轉(zhuǎn)換函數(shù),不過在具體的運(yùn)行中,我發(fā)現(xiàn)利用這兩個(gè)函數(shù)只能傳送不大于8K字節(jié)的文件,并且要求是文本類型才可以。因此,我們不能采用此中解決辦法,還好,VFP6.0提供了二個(gè)非常有用的字節(jié)處理函數(shù)bintoc()和ctobin(),其中bintoc()函數(shù)是將長(zhǎng)整型數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的4個(gè)字節(jié)字符(默認(rèn)值,可改動(dòng)),ctobin()函數(shù)則相反,有關(guān)的詳細(xì)資料請(qǐng)參閱VFP幫助。這樣我們就可以利用這兩個(gè)函數(shù)來進(jìn)行文件的傳輸了。有了上面的基礎(chǔ),想必該怎么編寫代碼你也該會(huì)了(只需在Winsock對(duì)象的DataArrive事件中加入一些代碼即可),我就不詳述了。