如何在PB中使用WINSOCK控制項
原著:達偉春
隨著資源共用和即時通訊的需要,很多電腦應用程式早已甩開單兵作戰的模式,轉入聯合行動。
網路在電腦世界裡,越來越發揮著舉足輕重的作用。在WINDOWS應用程式中,處理即時通訊最常用到的還是MICROSOFT公司提供的 WINSOCK控制項。許多資料都細述了WINSOCK在VB中的使用方法,就連WINDOWS本身提供的hlp檔案也是針對VB而寫的。筆者因為實際應用 的需要,琢磨出了WINSOCK控制項在PB中的應用方法。好東西不敢獨自享用,拿出來與大家共用。
下面以一個簡單程式為例,說明WINSOCK控制項在PB中的使用:
一、在視窗中添加WINSOCK控制項:
在應用中新開一個視窗,在視窗畫板中點擊controls--> OLE功能表項目,彈出Insert object視窗,
單擊Insert control標籤,從列表框中雙擊選定Microsoft Winsock control,將winsock的表徵圖貼在視窗上。
在程式中該控制項名稱定為winsock_a(甲方)和winsock_b(乙方)。
二、設定資訊輸入輸出文字框:
在視窗中增加一個按鈕cb_1,兩個單行文字框sle_1,sle_2,分別用於輸入要發送的字串和接受對方發送的字串。
三、設定通訊協議:WINSOCK控制項允許使用者以UDP和TCP兩種協議中任選一種進行通訊。
1、UDP通訊協定設定:UDP協議是一種不需連線的通訊協議,在通訊之前,需要綁定remotehost和remoteport屬性,如果需要雙向通訊,還要設定localport屬性。
在甲方(本機地址為:134.1.1.1)視窗的Open事件中加入如下語句:
winsock_a.object.protocol=1 //winsock通訊協議設為UDP協議
winsock_a.object.remotehost="134.1.1.2" //對方的ip地址
winsock_a.object.remoteport=6000 //對方的winsock通訊連接埠號碼
winsock_a.object.localport=6001 //原生winsock通訊連接埠號碼
winsock_a.object.bind //綁定通訊協議
在乙方(本機地址為:134.1.1.2)視窗的Open事件中加入如下語句:
winsock_b.object.protocol=1 //winsock通訊協議設為UDP協議
winsock_b.object.remotehost="134.1.1.1" //對方的ip地址
winsock_b.object.remoteport=6001 //對方的winsock通訊連接埠號碼
winsock_b.object.localport=6000 //原生winsock通訊連接埠號碼
winsock_b.object.bin //綁定通訊協議
2、TCP通訊協定設定:TCP協議在通訊前需要進行串連。
在甲方(作為伺服器端)視窗的Open事件中加入如下語句:
winsock_a.object.protocol=0 //winsock通訊協議設為TCP協議
winsock_a.object.localport=6001 //原生winsock通訊連接埠號碼
winsock_a.listen() //啟動監聽
在甲方winsock_a控制項的Connectionrequest事件中加入如下語句:
//接受到對方的串連請求後
if winsock_a.object.state <> 0 then
winsock_a.close()
end if
winsock_a.accept(requestID) //建立直接連接
//requestID是Connectionrequest事件自己的參數
在乙方(作為用戶端)視窗的Open事件中加入如下語句:
winsock_b.object.protocol=0 //winsock通訊協議設為TCP協議
winsock_b.object.remotehost="134.1.1.2" //對方的ip地址
winsock_b.object.remoteport=6000 //對方的winsock通訊連接埠號碼
winsock_b.connect() //發出串連請求
3、無論採用哪種協議,都要在視窗的Close事件中加入如下語句:
if winsock_a/*或winsock_b*/.object.state < > 0 then
winsock_a.close()
end if
否則可能第二次使用時發生異常問題。
四、開始通訊
在按鈕cb_1(caption屬性設為‘發送’)的click事件中加入如下語句:
winsock_a/*或winsock_b*/.object.send (sle_1.text)
在winsock_a/*或winsock_b*/控制項的dataarrival事件中加入如下語句:
//接受到對方資料後
string datastr1 winsock_a/*或winsock_b*/.object.getdata (def datastr1) sle_2.text=datastr1 //將資料字串顯示在文字框中。
以上程式實際上體現了聊天器的底層工作原理,稍加修改擴充就可以做成一個很好的聊天軟體。