製作乙個網路通訊類(一)

2021-05-08 09:46:28 字數 3420 閱讀 3435

tcplistener類提供一些簡單方法,用於在同步阻塞模式下偵聽和接受傳入連線請求。

tcpclient 類提供了一些簡單的方法,用於在同步阻塞模式下通過網路來連線、傳送和接收流資料。

* 每個ctcptalk物件中包含乙個用於監聽的tcplistener部件,乙個用於傳輸資料的tcpclient部件,和乙個用於接收連線請求的tcpclient部件。

* 在建立乙個ctcptalk時需要指定要使用的埠號。然後使用ctcptalk.open開啟對網路的監聽。

* 接收資料:當監聽到有資料傳送到本機時,使用接收連線請求的tcpclient部件接收對方的連線請求以及傳送來的資料。接收完畢後關閉tcpclient部件,並觸發dataarrival事件,可以使用getdata()函式獲取收到的資料。

* 傳送資料:設定接收方的名稱和埠,使用傳輸資料的tcpclient部件請求連線,連線成功後傳送資料。資料傳送完畢之後關閉tcpclient部件,並觸發sendcomplete事件。

* 由於tcplistener和tcpclient都是工作在同步阻塞模式下,因此資料傳輸和監聽都使用了單獨的執行緒。

* 對於tcplistener的監聽執行緒,因為是阻塞的模式,所以在關閉監聽時,需要先由本機向本機自己發乙個連線請求,以解除監聽執行緒的阻塞,然後通過相應量的設定,退出監聽迴圈,關閉監聽。在監聽阻塞狀態下直接關閉監聽會導致錯誤,通過錯誤陷阱隱藏後,似乎也不會影響後面的使用。

* 使用流模式讀取和傳送資料,為了方便而採用了流的同步讀寫。

* 設計為傳送方申請建立連線、傳送接收完畢後立刻斷開連線的模式。類似於點對點的模型,沒有伺服器客戶端之分。參加通訊的機器只需要維持乙個監聽執行緒就可以了。而不必保留已連線列表並隨時檢查列表中各個項的連線狀態。這也是因為採用了同步讀寫模式,如果阻塞流的讀執行緒反而會大大降低效能。

* 對於傳輸資料量的大小,有8k位元組的限制。由於使用了unicode編碼解碼,所以實際的傳輸量測試為每次4k以下。可以通過外部程式設計對大資料量進行分頁傳輸,但是在內部仍然是每次傳輸前建立連線、傳輸完畢後斷開連線的方式。因此對於過大的資料需要消耗額外的資源用於頻繁建立和斷開連線。

* 因為可能要用於.net framework精簡版,所以方法、事件和屬性都考慮使用受精簡版支援的版本。

測試程式介面(單機測試)

本介面為單機測試結果。此程式也可用於多機。

按鈕加入網路

啟動本機的網路監聽。此按鈕在已經啟動監聽後不可用

name = bjoinnet

按鈕退出網路

關閉本機的網路監聽。關閉之後將無法再接收連線請求。此按鈕在監聽關閉時不可用

name = bexitnet

按鈕關閉程式

關閉程式

name = bclose

按鈕傳送

傳送文字框中的內容。在未加入網路時此按鈕不可用。

name = bsend

文字框傳送的內容

name = tbsend

multiline = true

scrollbars = vertical

文字框接收的內容

name = tbrecv

multiline = true

scrollbars = vertical

readonly = true

文字框狀態監視

name = tbstate

multiline = true

scrollbars = vertical

readonly = true

元件宣告

private sub bjoinnet_click(byval sender as system.object, byval e as system.eventargs) handles bjoinnet.click

'檢查埠號

if tbport.text = "" then

msgbox("請輸入埠號")

exit sub

end if

dim port as long

tryport = clng(tbport.text)

catch ex as exception

msgbox("埠號格式錯誤, 請重新設定")

exit sub

end try

'開啟監聽

sck1 = new ctcptalk(port)

sck1.open()

'設定介面

setuilisten()

end sub

按鈕退出網路

private sub bsend_click(byval sender as system.object, byval e as system.eventargs) handles bsend.click

'檢查引數

if tbremote.text = "" then

msgbox("請輸入對方計算機名稱或ip")

tbremote.focus()

exit sub

end if

if tbport.text = "" then

msgbox("請輸入埠號")

exit sub

end if

dim port as long

tryport = clng(tbport.text)

catch ex as exception

msgbox("埠號格式錯誤")

exit sub

end try

'設定遠端主機名稱和埠

sck1.remoteport = port

sck1.remotehost = tbremote.text

'傳送資料

sck1.send(tbsend.text)

end sub

sck1的dataarrival的errorevt的connect的sendcomplete設定介面(等待狀態)

用乙個類實現網路通訊功能

背景或原因 環境 windows系統 可執行c 程式 網路連線正常 具體功能 完成tcp ip 通訊。其中tcp服務端 tcp客戶端 udp方式可選,以類似流的方式及使用 來接收和傳送且傳輸量可選。使用示例 include nstream.h int main return 0 標頭檔案 nstre...

TCPAPI網路通訊 乙個伺服器對乙個

伺服器 在winsockseverdlg.h中新增變數 public int getcount void sendtoall socket s,char buff socket m sock cwinsockseverdlg socket msgsock 50 int addlen sockaddr...

華為網路通訊基一

2.網路通訊的簡述原理 1 應用程式生成需要傳遞的資訊。2 應用程式將資料打包成原始的 資料載荷 3 在原始的資料載荷的前後分別加上 頭部 和 尾部 形成 報文 報文頭部中最重要的資訊是接受者的資訊,亦即 目的位址 在乙個資訊單元的基礎上,增加一些新的資訊段,使其形成乙個新的資訊單元,這個過程稱為 ...