一.前言:
這不是P2P,就是監聽端口
二.基本類介紹:
1.Listener類:
Listener類是用來監聽新的連接。當它的一個對象被建立並開啓後,該對象就開始不斷監聽來自網絡中的連接請求。一旦有了一個連接請求,該對象就設法 建立連接並取得它的字節流進而轉化成字符串顯示在控制檯中。當一個連接結束後,該對象就繼續進行監聽來自網絡中的連接請求。
代碼以及註釋如下:
namespace P2PTest { using System; using System.Net.Sockets; using System.Threading;
public class Listener public Listener()//構造函數 public void Stop() private void Listen() while(listenerRun)//開始監聽 |
對Listen()函數的補充說明:
這個函數是Listener類的核心部分。該函數首先被構造函數調用。只要布爾值listenerRun爲true,我們就可以在端口5656創建並 開始一個Tcp監聽對象TcpListener進行監聽網絡中的連接請求,而一旦listenerRun被置爲false,則表示程序結束了。在循環體內 部,我們先接受一個連接,用s.RemoteEndPoint獲得它的IP地址並獲得其字節流。根據獲得的字節流,我們用UTF8編碼將它轉化爲字符串。 最後,我們就在控制檯中顯示獲得的字符串。
對於catch語句,第一個塊捕獲一個可能由防火牆引起的例外。因爲對於防火牆而言,它可能認爲這是一個特洛依木馬或是儒蟲病毒什麼的,所以就會拒絕 通過。解決辦法就是重新配置防火牆。第二個塊用於捕獲一般的例外,比如當我們調用了stop()函數後,我們銷燬了TcpListener對象,那就自然 不可能再進行監聽了。
2.Sender 類:
Sender類就一個函數,所以是相當簡單的。
代碼以及註釋如下:
namespace P2PTest { using System; using System.IO; using System.Net.Sockets;
public class Sender try StreamWriter reqStreamW = new StreamWriter(tcpStream); |
對Send()函數的補充說明:
Send(string[] aInput)函數將一個數組作爲參數。數組的第一個元素Send(aInput[0])必須包含”send”這個字,否則Sender對象不會被創建 (更多內容在InputHandler類中);第二個元素包含了目標計算機的IP地址;剩下的就是要發送的內容信息了。
在try塊中,我們根據遠程計算機的IP地址在端口5656(要確保端口號統一)創建了一個TcpClient對象。然後,我們建立一個 NetworkStream 和一個StremWriter對象來發送我們的信息。在catch塊中,我們用它來捕獲一般的例外,比如遠程計算機拒絕連接請求、網絡不通什麼的。
3.InputHandler類:
InputHandler類主要用來控制用戶輸入。
代碼以及註釋如下:
namespace P2PTest { using System;
public class InputHandler private static Listener li;//一個靜態的Listener對象 public void Input() |
對InputHandler類的補充說明:
該類中有一個靜態的Listener對象li,一旦計算機運行此程序並執行”start”操作,該計算機就可以成爲網絡中的服務器來監聽其他計算機的連接 請求。而該類的核心部分是一個switch case語句系列,通過不同的操作,我們可以使計算機扮演不同的角色:”send”操作表明該計算機相對目的計算機而言成了客戶端;而”start”操作 就將計算機自身置爲服務器端,這正體現了P2P的既是服務器端又是客戶端的”非中心化”的原則;同時程序也提供了一些其他的輔助操作。
4.Initialize類:
Initialize類進行程序的初始化工作,它新建了一個InputHandler對象,只要該對象的布爾值appRun爲true,就一直運行 之,直到該值爲false,程序退出。
代碼以及註釋如下:
namespace P2PTest { using System;
public class Init |
到此爲止,四個類已經介紹完畢,我想大家也早已等不及了吧,下面就簡單給大家介紹一下具體實現程序的方法。
三.實現方法:
首先,打開Visual Studio.Net,新建一個名爲P2Ptest的控制檯應用程序的Visual C#項目,圖示如下:
圖1
其次,將以上四個類分別保存爲四個文件:listener.cs,sender.cs,inputHandler.cs,initialize.cs。然 後將這四個文件添加到當前的工程中,同時把原有的主文件刪除即可(因爲在initialize.cs中已經有主函數了)。
最後,按Ctrl+F5即可執行程序了。
爲了進行測試,我們需要打開兩個P2Ptest程序,一個作爲服務器端,另一個作爲客戶端。服務器端的圖示如下(此時已經開始監聽了):
圖2
客戶端的圖示如下(輸入命令行:send 10.85.7.79 Hello,I’m Pitt.Can you hear me??):
圖3
再看服務器端的情況,圖示如下:
圖4
從圖示可以看到服務器端已經收到消息了。同時,只要客戶端也開啓了監聽功能,服務器端也就能向客戶端發送信息了。這樣它們的關係就不再是服務器-客戶 機的關係了,而是Peer-to-Peer的關係了。
四.總結:
現在一個很基本的P2P應用程序以及完成,通過它,我們可以利用P2P技術的基本特性實現點對點通信。通過這個程序,我相信大家對C#下的P2P編程應該 有了大致的瞭解。對於這個程序,不足的一點是功能比較簡單,只可以發送、接受信息,而且還是基於控制檯的,讀者可以試着開發出功能更強大的基於 Windows Forms的P2P應用程序。