一、編程基礎(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ù)端
服務(wù)器端
在上面的界面中共有5個(gè)對(duì)象,屬性Name=TcpServer,LocalHostport=1001,此屬性務(wù)必和客戶端的遠(yuǎn)程主機(jī)端口一致,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
三、實(shí)現(xiàn)代碼
1.客戶端
■表單的 Init 事件:
public strData
strData = \"\"
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 bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服務(wù)端
■表單的 Init 事件:
public strData
strData = \"\"
thisform.tcpServer.Object.LocalPort = 1001
thisform.tcpServer.Object.Listen
■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
endif
thisform.tcpServer.OBJECT.Accept(requestID) 常數(shù) 值 說明
sckClosed 0 關(guān)閉(默認(rèn))
sckOpen 1 打開
sckListening 2 偵聽
sckConnected 7 已連接
sckError 9 發(fā)生了錯(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事件中加入一些代碼即可),我就不詳述了。
因?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ù)端
服務(wù)器端
在上面的界面中共有5個(gè)對(duì)象,屬性Name=TcpServer,LocalHostport=1001,此屬性務(wù)必和客戶端的遠(yuǎn)程主機(jī)端口一致,其余屬性可根據(jù)需要自行設(shè)置,其余對(duì)象的設(shè)置也可自行設(shè)置。
三、實(shí)現(xiàn)代碼
1.客戶端
■表單的 Init 事件:
public strData
strData = \"\"
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 bytestotal
thisform.tcpClient.Object.GetData(@strData)
thisform.txtOutput1.Value = strData
■TxtSend1.InteractiveChange 事件
thisform.tcpClient.Object.SendData(this.Value)
2.服務(wù)端
■表單的 Init 事件:
public strData
strData = \"\"
thisform.tcpServer.Object.LocalPort = 1001
thisform.tcpServer.Object.Listen
■TcpServer.ConnectionRequest 事件
*** ActiveX Control Event ***
LPARAMETERS requestID
If thisform.tcpServer.OBJECT.State <> 0
thisform.tcpServer.OBJECT.Close
endif
thisform.tcpServer.OBJECT.Accept(requestID) 常數(shù) 值 說明
sckClosed 0 關(guān)閉(默認(rèn))
sckOpen 1 打開
sckListening 2 偵聽
sckConnected 7 已連接
sckError 9 發(fā)生了錯(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事件中加入一些代碼即可),我就不詳述了。

