在POWERBUILDER中使用WINSOCK控制元件的方法

hurcn發表於2007-08-13
  隨著資源共享和實時通訊的需要,很多計算機應用程式早已甩開單兵作戰的模式,轉入聯合行動。

  網路在計算機世界裡,越來越發揮著舉足輕重的作用。在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 //將資料字串顯示在文字框中

  以上程式實際上體現了聊天器的底層工作原理,稍加修改擴充就可以做成一個很好的聊天軟體。 

相關文章