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 在原始的資料載荷的前後分別加上 頭部 和 尾部 形成 報文 報文頭部中最重要的資訊是接受者的資訊,亦即 目的位址 在乙個資訊單元的基礎上,增加一些新的資訊段,使其形成乙個新的資訊單元,這個過程稱為 ...