在VFP下實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的基本方法

字號(hào):

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