VFP實現(xiàn)點對點通信實現(xiàn)方法及代碼

字號:

一、編程基礎(chǔ)
    因為有關(guān)Winsock控件的資料在很多媒體上都有相關(guān)介紹,因此為了節(jié)省篇幅,我就不再作具體介紹,請大家查找一下有關(guān)資料即可,這里我只簡單說一下要用到的一些設(shè)置。為了保證通訊的可靠性,在下面的程序中使用的是TCP/IP協(xié)議,并且在客戶端和服務(wù)端均采用預(yù)設(shè)端口1001(大家在實踐時可以自行更改)。
    二、界面設(shè)計
    1.客戶端
    客戶端
    在上面的界面中共有7個對象,屬性Name=TcpClient,RemoteHostport=1001,其余屬性可根據(jù)需要自行設(shè)置,其余對象的設(shè)置也可自行設(shè)置。
    2.服務(wù)端
    服務(wù)器端
    在上面的界面中共有5個對象,屬性Name=TcpServer,LocalHostport=1001,此屬性務(wù)必和客戶端的遠程主機端口一致,其余屬性可根據(jù)需要自行設(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)閉(默認)
    sckOpen 1 打開
    sckListening 2 偵聽
    sckConnected 7 已連接
    sckError 9 發(fā)生了錯誤
    ■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)在我們就可以運行了,看看怎么樣,既可以在同一臺機器上運行,也可以在局域網(wǎng)上運行。
    注意
    一定要在Winsock對象代碼中加入VFP的關(guān)鍵字OBJECT,否則是不可能成功的(我也是在無數(shù)次失敗后才得到的答案)。
    四、擴展及其它
    以上我們簡單實現(xiàn)了使用Winsock控件的點對點通信程序,界面比較簡單,功能也相對較少,讀者可據(jù)此進行擴充。下面我再說說有關(guān)文件傳輸?shù)膯栴}。
    在上面的程序中,已經(jīng)能夠進行實時點對點通信,但要用此進行文件傳輸,還有一大難題需要解決。因為VFP并不提供二進制類型的變量定義,因此要向進行文件的傳輸,必須解決ASCII碼大于128的字符傳送問題。不過在VFP6.0版本中,提供了filetostr()和strtofile()文件與內(nèi)存變量的轉(zhuǎn)換函數(shù),不過在具體的運行中,我發(fā)現(xiàn)利用這兩個函數(shù)只能傳送不大于8K字節(jié)的文件,并且要求是文本類型才可以。因此,我們不能采用此中解決辦法,還好,VFP6.0提供了二個非常有用的字節(jié)處理函數(shù)bintoc()和ctobin(),其中bintoc()函數(shù)是將長整型數(shù)據(jù)轉(zhuǎn)換為相應(yīng)的4個字節(jié)字符(默認值,可改動),ctobin()函數(shù)則相反,有關(guān)的詳細資料請參閱VFP幫助。這樣我們就可以利用這兩個函數(shù)來進行文件的傳輸了。有了上面的基礎(chǔ),想必該怎么編寫代碼你也該會了(只需在Winsock對象的DataArrive事件中加入一些代碼即可),我就不詳述了。