熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

VB.NET實現PC與掌上電腦PPC的雙向通信

2022-06-13   來源: .NET編程 
本文介紹如何利用 通過Windows Sockets (Winsock)以及多線程編程進行桌面電腦與Pocket PC(掌上電腦簡稱PPC)間的雙向通信並且通過當今流行平台編程語言Visaul BasicNet 編寫PC端和PPC端程序實現兩者的信息交換

  一概述

  如今移動計算設備越來越普及而PPC與桌面電腦的數據交換更是其必不可少的功能筆者根據實際的無線PPC開發認為PPC程序與桌面程序進行通信除了可以通過SQL Server CE提供的RDA(遠程數據存取)和Replication(復制)來完成與桌面SQL Server的數據存取外另外一種比較方便快捷的方法則是通過Socket與桌面電腦完成信息的交換
 
  采用Visaul BasicNet 進行PPC和桌面電腦的程序編寫已經完全不同於過去的VB它的諸多新特性以及依托Net平台強大的面向對象體系使VBNet煥然一新不僅編寫桌面程序更加輕松快捷而且更可快速的可視化的開發以Pocket PC為平台的智能設備程序

  Net框架是一種新的計算平台可以簡單理解為組件庫或者類庫類似於MFC和VCL但是卻比它們更加強大和易用NET框架具有兩個主要組件公共語言運行庫和 NET 框架類庫公共語言運行庫是 NET 框架的基礎可以將運行庫看作一個在執行時管理代碼的代理它提供核心服務(如內存管理線程管理和遠程處理等)以運行庫為目標的代碼稱為托管代碼而不以運行庫為目標的代碼稱為非托管代碼NET 框架類庫是一個與公共語言運行庫緊密集成的可重用的類型集合該類庫是面向對象的NET 框架類庫能夠完成一系列常見編程任務包括諸如字符串管理數據收集數據庫連接以及文件訪問等任務

  Net框架精簡版是完整Net框架的子集它是對完整的 Net框架進行精簡後得到的版本雖然其規模大大減小但多數功能仍然保持完整使用NET框架精簡版可以針對Pocket PC和其他Windows CE NET設備進行開發和部署提高開發人員的工作效率 VBNet編譯的桌面程序在目標機器上需要Net框架的支持才能運行而編譯過的PPC程序需要在目標PPC上裝載Net框架精簡版後方可運行

  二設計思路

  在Net框架中SystemNetSockets命名空間為需要嚴密控制網絡訪問的開發提供了 Windows Sockets (Winsock) 接口的托管實現該命名空間中包含了與Socket相關的類接口和枚舉主要包括實現 Berkeley 套接字接口的Socket類用於 TCP 網絡客戶端偵聽連接的TcpListener類為 TCP 網絡服務提供客戶端連接的TcpClient類以及提供無連接的發送和接收用戶數據文報 (UDP) 的網絡服務等該命名空間下的大部分類都受Net框架精簡版的支持也就是說實現這些對象的代碼完全可以在裝載有Net框架精簡版的PPC上運行

  可以把PPC當作局域網中的一個終端來與桌面電腦連接它們之間有多種物理連接方式通常可以使用USB線纜配合ActiveSync直接與桌面電腦連接當然若PPC和桌面電腦同時具備其它的連接方式比如無線WiFi(無線x)藍牙等都可以組成相應的無線局域網絡

  在PPC上編寫客戶端程序並實現TcpClient類用於連接發送和接收流數據在桌面電腦上我們設計Socket服務端程序並實現TcpListener類和Socket類用於偵聽和接受傳入連接的請求Socket類為網絡通信提供了一套非常豐富的方法和屬性服務程序可以使用 TcpListenerListen 方法偵聽連接Accept 方法處理任何傳入的連接請求並返回可用於與遠程主機進行數據通信的Socket如果當前使用的是無連接協議(如UDP)則根本不需要偵聽連接實際上TcpClient類和TcpListener類為 Socket通信提供了比Socket類更簡單對用戶更友好的接口如果編寫較簡單的應用程序而且只需同步數據傳輸則可以考慮使用 TcpClientTcpListener 和 UdpClient

……
Listener = New TcpListener(SystemNetIPAddressParse())
ListenerStart()
LabelText = 正在 : 處偵聽
……
  三程序的具體實現

  創建PPC客戶端程序

  啟動Visual Studio Net 新建Visaul Basic項目並選擇智能設備應用程序選擇Pocket PC平台的Windows 應用程序並創建項目Pocket PC平台是Windows CE 平台的子集Windows CE系統的應用則更加廣泛項目創建完後Visaul StudioNet會創建一個默認的主窗體Form在窗體上分別放置兩個Panel控件四個Label控件三個TextBox控件和兩個Button控件

  PPC客戶端程序界面




  設計PPC程序的Form窗體與桌面程序沒有太多差別只是少了一些PPC上所不支持的屬性但是屬性的名稱並沒有變化在PPC上沒有窗口最小化的實際意義所以主窗體的MinimizeBox屬性必須設置成False否則當需要退出程序點擊標題欄最右側的關閉按鈕時程序並沒有真正退出而是隱藏在後台程序需要重新激活才能回到前台或者可以向一個Button添加關閉主窗體的代碼

Private Sub Button_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles ButtonClick
 MeClose()
End Sub
  Me 為VBNet中的關鍵字可以引用當前在其中執行代碼的類或結構的特定實例Me 的行為與引用當前實例的對象變量或結構變量類似此例Me代表主窗體的實例Form使用TcpClient向TcpListener或Socket 偵聽器連接並交換數據可以使用下面兩種方法之一連接到偵聽器

  ()創建一個 TcpClient並調用三個可用的 Connect 方法之一

  ()使用遠程主機的主機名和端口號創建 TcpClient此構造函數將自動嘗試一個連接

  TcpClient的Connect 方法使用指定的主機名和端口號將客戶端連接到 TCP 主機重載函數原型為

  使用指定的遠程網絡終結點將客戶端連接到遠程 TCP 主機

Overloads Public Sub Connect(IPEndPoint)
  使用指定的 IP 地址和端口號將客戶端連接到 TCP 主機

Overloads Public Sub Connect(IPAddress Integer)
  將客戶端連接到指定主機上的指定端口

Overloads Public Sub Connect(String Integer)
  我們使用指定的本地主機IP地址和端口號將客戶端連接到TCP主機在堆棧中創建TcpClient對象的實例當執行退出當前過程或函數時堆棧中的資源會自動清除保證內存空間被正確釋放連接成功後要發送和接收數據使用 GetStream 方法來獲取一個NetworkStreamNetworkStream為基礎數據流調用 NetworkStream 的 Write 和 Read 方法與遠程主機之間發送和接收數據當發送操作結束後使用 TcpClient的Close 方法斷開連接關閉對象並釋放與 TcpClient 關聯的所有資源

  雙擊連接按鈕編寫連接代碼代碼片段如下

  創建TcpClient對象的實例

Client = New TcpClient

通過計算機名稱和端口號連接到指定的計算機

ClientConnect()
SendData =由PPC傳遞過來的數據 – AuthorRisen

按一定的編碼規則對要傳遞的數據進行編碼 Buffer = EncodingUTFGetBytes(SendData)

向已連接的服務程序發送數據

ClientGetStream()Write(Buffer BufferLength)

DataAvailable 指示NetworkStream 上是否有可用的數據如果可以在流上讀取數據則為 true

否則為 false只要有數據存在就等待傳輸完畢

While Not ClientGetStreamDataAvailable()
 ApplicationDoEvents()
End While

接收由服務程序傳遞回客戶端的數據並顯示在對話框上

If ClientGetStreamDataAvailable() Then
 ClientGetStream()Read(InBuff InBuffLength)
 rtndata = 服務程序已經成功收到指令 & SystemTextEncodingDefaultGetString(InBuff InBuffLength)
 MsgBox(rtndata)
End If

斷開連接關閉對象並釋放與 TcpClient 關聯的所有資源


ClientClose()


  正確編譯上述代碼還需要在源文件的頭部加入使用命名空間的引用才能正確使用命名空間中的所有枚舉結構類或模塊等

Imports Sockets <添加需要導入的命名空間
Imports SystemText <添加需要導入的命名空間
Public Class Form

……
  跟蹤調試PPC程序需要在適當的模擬器下進行譬如系統默認的PocketPC 模擬器程序調試無誤後可以連接到實際的PocketPC設備運行實際部署到PPC設備需要在連接的桌面電腦上安裝Microsoft ActiveSync將程序傳輸到用戶目錄中

  創建桌面服務端程序

  啟動Visual Studio Net 新建Visaul Basic項目並選擇Windows應用程序創建項目項目創建完後Visaul StudioNet會創建一個默認的主窗體Form在窗體上分別放置三個Label控件兩個TextBox控件一個列表框控件和一個Button控件

  創建全局的TcpListener對象的實例來偵聽特定的端口代碼片段如下

創建在本機IP地址和端口偵聽的TcpListener對象的實例

Listener = New TcpListener( )

開始偵聽

ListenerStart()

偵聽狀態標志

Listening = True
LabelText = 正在 處偵聽

……
  通過計時器定時檢測偵聽器有無連接請求並啟用多線程來處理接收到的數據代碼片段如下 聲明創建線程時使用 ThreadStart 委托作為其唯一參數的構造函數創建 Thread 類的新實例

Dim CurThreadStart As ThreadStart
Dim CurThread As Thread

檢測偵聽器是否有掛起的連接請求沒有則退出計時器事件

If Not ListenerPending() Then
 Exit Sub
End If

有連接的請求則將計時器暫停准備進行處理

tmProcessRequestEnabled = False

創建線程委托傳遞需要操作的過程的地址

CurThreadStart = New ThreadStart(AddressOf ProcessRequest)
CurThread = New Thread(CurThreadStart)

開始一個線程

CurThreadStart()

重新啟動計時器

tmProcessRequestEnabled = True

  將計時器觸發事件的頻率Interval(以毫秒為單位)適當調節可以改變服務程序響應連接請求的快慢

  計時器不斷循環一旦發現有連接的請求就會創建一個線程專門來處理這個連接創建線程時需要傳遞處理連接的過程或函數的地址以被線程調用



  服務程序通過已連接的Socket獲取數據接收到的數據按相應的編碼規則進行解碼並將信息添加到列表框中

……

CurThread = SystemThreadingThreadCurrentThread()

接受掛起的連接請求並返回可用來發送和接收數據的Socket

CurSocket = ListenerAcceptSocket

While Listening
 If CurSocketAvailable > Then
  接收來自綁定的Socket的數據
  Bytes = CurSocketReceive(Buffer BufferLength )
  將接收到的數據轉化成相應編碼的字符串
  ReceivedData= EncodingUTFGetString(Buffer)
  SyncLock CurThread
  lbReceivedItemsAdd(ReceivedData)
End SyncLock
……
  TCPListenerAcceptSocket接受掛起的連接請求並且返回用於發送和接收數據的 Socket此 Socket 繼續用於和新連接上的客戶端通信

  SyncLock 語句確保多個線程不會同時執行向列表框添加數據的操作當線程到達 SyncLock 塊時將計算表達式並保持此互斥性直到在表達式返回的對象上有鎖為止這防止了表達式在多個線程運行期間更改值從而避免代碼產生意外的結果

  向客戶端返回服務端處理後的消息代碼片段如下

格式化返回消息 這是服務器端處理後的結果並返回到客戶端

BacktoClientData = SystemDateTimeNow 向客戶端傳遞服務端程序處理時的時間
Buffer = EncodingUTFGetBytes(BacktoClientDataToCharArray)

通過打開的套接字將結果發送回客戶端應用程序然後關閉該套接字

CurSocketSend(Buffer BufferLength )
CurSocketClose()
  編譯桌面服務端程序運行效果如下圖所示



  當服務程序處理完一個連接後就向相應的PPC客戶端返回一條成功信息如下圖所示



  至此PPC客戶端程序和桌面服務端程序編寫完畢該系統在安裝WindowsXP SP的桌面電腦和Dell Xi 的PPC上測試通過

  四結論

  本程序簡單介紹了PC與PPC之間Socket通信方法在實際應用中還有很多細節要做並且還有可以拓展的地方該模型為實現PC與PPC間復雜的信息交互創建復雜的無線信息系統提供了一定技術基礎


From:http://tw.wingwit.com/Article/program/net/201311/11532.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.