VFP實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信實(shí)現(xiàn)方法及代碼

字號(hào):

一、編程基礎(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事件中加入一些代碼即可),我就不詳述了。