C 下用P2P技術實現點對點聊天

2021-04-13 08:33:15 字數 3588 閱讀 3106

p2p技術簡介

理解p2p技術的最好方法莫過於仔細觀察並理解乙個實際的p2p應用程式。c#作為微軟.net戰略的重要棋子,對網路程式設計提供了很好的支援和優化。本文就通過乙個程式,向大家介紹一下c#下的p2p程式設計的方法和實現機理。本文的這個程式不是很有用,但卻很直觀地給出了p2p(點對點)程式設計以及套介面程式設計的一些基本知識和概念。它是建立在tcplistener以及tcpclient這兩個類基礎上的。程式實現的原理也比較簡單,但是用到了p2p技術重返「非中心化」的基本原則。簡言之,用這個程式可以在網路中傳送、接受訊息,任何一台計算機既可以作為伺服器端,又可以作為客戶端。

系統要求:

1.widows 2000伺服器版作業系統或後續版本的作業系統。

2.visual studio.net framework正式版。

具體方法:

首先,開啟vs.net,新建乙個c#專案(注意:模板為windows應用程式),不妨命名為"p2pchat"。圖示如下:

其次,參照icq、oicq等聊天工具,我們可以將程式的主介面布置成和常見聊天工具的訊息傳送對話方塊類似的布局。不過由於程式僅乙個主介面,所以還要新增一些諸如「開始監聽」、「停止監聽」等控制按鈕。同時,程式是支援暱稱顯示的。於是,按照這個思想,我們可以開始布置程式的主介面了。首先,往主介面上拖放如下一些控制項:兩個label控制項、三個button控制項、三個textbox控制項、乙個richtextbox控制項以及乙個statusbar控制項。各個控制項的屬性設定如下表所示:

form1

text屬性

p2p聊天工具

label1

text屬性

testslign屬性

middlecenter

label2

text屬性

暱稱:textalign屬性

middlecenter

button1

text屬性

開始監聽

flatstyle屬性

flat

button2

text屬性

停止監聽

flatstyle屬性

flat

enabled屬性

false

anchor屬性

top, right

button3

text屬性

傳送訊息

flatstyle屬性

flat

anchor屬性

top, right

textbox1

text屬性

(空)anchor屬性

top, left, right

textbox2

text屬性

(空)multiline屬性

true

anchor屬性

top, left, right

textbox3

text屬性

(空)forecolor屬性

firebrick

anchor屬性

top, left, right

richtextbox1

text屬性

(空)forecolor屬性

steelblue

readonly屬性

true

anchor屬性

top, bottom, left, right

注:其中的anchor屬性是設定窗體上控制項布局用的,當窗體大小改變後各個控制項如何在窗體上重新分布由該屬性決定,讀者可參考更詳細的介紹文章來理解。

其他屬性為預設即可,最終布置主窗體介面如下所示:

現在到了程式的主體部分,即**部分。在給出**之前,我想先向大家介紹一下實現的基本原理以及其中的一些邏輯關係。

首先,程式執行後,使用者得先按下「開始監聽」按鈕,按鈕相應事件後,程式就進入了監聽狀態,狀態列有相應的顯示。這樣,本機就相當於「伺服器/客戶機」模式中的伺服器了,其他計算機可以連線到本機並向本機傳送訊息。其他計算機通過該程式連線到本機是通過ip位址來實現的,c#對網路程式設計有很好的支援,所以程式設計師的工作量是比較小的。如此,一台計算機可以向另一台傳送訊息了。然而,這是個p2p程式,所以只要另一台計算機的使用者也按下"開始監聽"按鈕,那台計算機也成了這台計算機的伺服器了。於是就實現了訊息互發功能,然而真正的伺服器是不存在的,每台計算機都是伺服器,每台計算機同時也是客戶機,這就體現了p2p技術的"非中心化"原則。

程式主要用到了乙個listen()函式和乙個send()函式。前者實現程式的監聽功能,函式實現如下:

private void listen()

} catch(system.security.securityexception)

catch(exception)

}

函式的主體是乙個try-catch語句,try部分又是乙個while迴圈,這表示只要使用者不按"停止監聽"按鈕,程式就會一直處於監聽狀態。監聽的埠是5656,這個埠是可以自己定義的,只要不跟常用的埠混淆就行了。一旦程式接收到遠端計算機的一條訊息,就將該訊息新增到訊息顯示框中(訊息顯示框就是那個richtextbox控制項)。函式的catch部分是捕捉一些異常用的,如使用者之間設定了防火牆,就不能彼此通訊了,或是對方已經停止監聽了,那當然就不能向它傳送訊息了。另乙個函式send()是實現程式傳送訊息的功能的。函式實現如下:

private void send()

catch(exception)

}

該函式的主體部分也是乙個try-catch語句,它先根據使用者的輸入,建立乙個和遠端計算機的連線,注意其埠也為5656,而且必須是5656,這是為了和接收方埠保持一致,這樣對方才能收到這裡傳送的訊息。接著,函式根據使用者在訊息輸入框中的內容以及使用者的暱稱向遠端計算機傳送訊息。這樣,只要網路無故障、遠端計算機已經處於監聽狀態,它就能接收到這裡傳送的訊息了。當然,這裡處於監聽狀態了,遠端的計算機也可以自如地往這裡發訊息。函式的catch部分也是用於捕捉一些異常的。

同時還要注意的是,由於該程式用到了許多網路程式設計所需的物件以及輸入輸出物件,又運用了多執行緒程式設計機制,所以在程式的開始出得新增如下一些名字空間:

using system.io;

using system.net.sockets;

using system.threading;

最後,程式中各個控制項的事件處理函式以及完整的**請參看文後附帶的源**包。程式執行的圖示如下:

現在乙個很基本的p2p運用程式以及完成,通過它,我們可以利用p2p技術的基本特性實現點對點通訊。通過這個程式,我相信大家對c#下的p2p程式設計應該有了大致的了解。對於這個程式,不足的一點是功能比較簡單,只可以傳送、接受資訊,而且不能穿過防火牆進行通訊,讀者可以試著開發出功能更強p2p應用程式。

總結

最後,筆者希望能通過此文喚起大家對p2p技術的興趣。因為p2p身後所蘊藏著的無比的創造力使人們對未來網際網路充滿了美好的憧憬,現在世界範圍的p2p應用熱潮也是一浪高過一浪。在可以預見的未來,隨著對p2p研究的進一步深入和關注p2p的群體逐漸增多,p2p必將進入乙個飛速發展的新時期。然而國內的p2p起步得比較晚,所以更需要有大量的技術研究投入以及足夠的重視以贏得更好的發展。在此,筆者希望國內的p2p能取得輝煌的發展。

C 下用P2P技術實現點對點聊天

p2p技術簡介 p2p,英文peer to peer的縮寫,中譯為對等互聯或點對點技術。p2p技術可以讓使用者可以直接連線到其他使用者的計算機,進行檔案共享與交換,同時p2p在深度搜尋 分布計算 協同工作等方面也大有用途。目前internet的儲存模式是 內容位於中心 而p2p技術的運用將使inte...

C 下用P2P技術實現點對點聊天

以前在使用vb來實現多執行緒的時候,發現有一定的難度。雖然也有這樣那樣的方法,但都不盡人意,但在c 中,要編寫多執行緒應用程式卻相當的簡單。這篇文章將作簡要的介紹,以起到拋磚引玉的作用!net將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒,必須先宣告引用此...

C 下用P2P技術實現點對點聊天

net將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒,必須先宣告引用此名字空間 usingsystem.threading 即使你沒有編寫多執行緒應用程式的經驗,也可能聽說過 啟動執行緒 殺死執行緒 這些詞,其實除了這兩個外,涉及多執行緒方面的還有諸如 暫...