點對點即Peer
To
Peer
通常簡寫為P
P
所謂網絡中的點對點
其實可以看成是一種對等的網絡模型
P
P其實是實現網絡上不同計算機之間
不經過中繼設備直接交換數據或服務的一種技術
P
P由於允許網絡中任一台計算機可以直接連接到網絡中其他計算機
並與之進行數據交換
這樣既消除了中間環節
也使得網絡上的溝通變得更容易
更直接
P
P作為一種網絡的模型
它有別於傳統的客戶/服務器模型
客戶/服務器模型一般都有預定義的客戶機和服務器
而在P
P模型轉並沒有明確的客戶端和服務器
但其實在P
P模型中
每一台計算機既可以看成是服務器
也可以看成是客戶機
在網絡中
傳統上的客戶機/服務器通訊模型中
發送服務請求或者發送數據的計算機
一般稱為客戶機
而接收
處理服務或接收數據的計算機稱為服務器
而在P
P網絡模型中
計算機不僅接收數據
還有發送數據
不僅提出服務請求
還有接收對方的服務請求
在下面介紹的用Visual C#實現的局域網點對點通訊程序
就有如下特點
在網絡利用此通訊程序進行通訊的任一計算機
在通訊之前
都需要偵聽端口號
接受其他機器的連接申請
並在連接建立後
就可以接收對方發送來的數據
同時也可以向其他機器提出連接申請
並在對方計算機允許建立連接請求後
發送數據到對方
可見在網絡中利用此軟件進行P
P網絡通訊的任一計算機既是客戶機
同樣也是服務器
一.程序的設計調試運行的軟件環境 (
)
微軟公司視窗
服務器版
(
)
Visual Studio
Net正式版
Net FrameWork SDK版本號
二.關鍵步驟及其解決方法 關鍵步驟就是實現信息在網絡中的發送和接收
數據接收使用的是Socket
數據發送使用的是NetworkStream
利用Socket來接收信息
為了更清楚的說明問題
程序在處理數據發送和接收時采用了不通的端口號
發送數據程序在缺省狀態設定的端口號為
下面代碼是偵聽端口號
接受網絡中對此端口號的連接請求
並在建立連接後
通過Socket接收遠程計算機發送來的數據
try
{
TcpListener tlListen
= new TcpListener (
) ;
//偵聽端口號
tlListen
Start ( ) ;
Socket skSocket = tlListen
AcceptSocket ( );
//接受遠程計算機的連接請求
並獲得用以接收數據的Socket實例
EndPoint tempRemoteEP = skSocket
RemoteEndPoint;
//獲得遠程計算機對應的網絡遠程終結點
while (true)
{
Byte [] byStream = new Byte[
];
//定義從遠程計算機接收到數據存放的數據緩沖區
int i = skSocket
ReceiveFrom(byStream
ref tempRemoteEP);
//接收數據
並存放到定義的緩沖區中
string sMessage = System
Text
Encoding
UTF
GetString(byStream);
//以指定的編碼
從緩沖區中解析出內容
MessageBox
Show ( sMessage );
//顯示傳送來的數據
}
}
catch ( System
Security
SecurityException )
{
MessageBox
Show (
防火牆安全錯誤!
錯誤
MessageBoxButtons
OK
MessageBoxIcon
Exclamation);
}
利用NetworkStream來傳送信息
在使用StreamWriter處理NetworkStream傳送數據時
數據傳送的編碼類型是
UTF
下列代碼是對IP地址為
的計算機的
端口號提出連接申請
並在連接申請建立後
以UTF
編碼發送字符串
您好
見到您很高興
到對方
由於下列代碼中的注釋比較詳細
這裡就不具體介紹了
下列代碼也是使用NetworkStream傳送數據的典型代碼
try
{
TcpClient tcpc = new TcpClient (
);
//對IP地址為
的計算機的
端口提出連接申請
NetworkStream tcpStream = tcpc
GetStream ( );
//如果連接申請建立
則獲得用以傳送數據的數據流
}
catch ( Exception )
{
MessageBox
Show (
目標計算機拒絕連接請求!
) ;
break ;
}
try
{
string sMsg =
您好
見到您很高興
;
StreamWriter reqStreamW = new StreamWriter (tcpStream);
//以特定的編碼往向數據流中寫入數據
默認為UTF
編碼
reqStreamW
Write (sMsg);
//將字符串寫入數據流中
reqStreamW
Flush ( );
//清理當前編寫器的所有緩沖區
並使所有緩沖數據寫入基礎流
}
catch(Exception)
{
MessageBox
Show (
無法發送信息到目標計算機!
) ;
}
當然在具體用Visual C#實現網絡點對點通訊程序時
還必須掌握很多其他方面的知識
如資源的回收
在用Visual C#編寫網絡應用程序的時候
很多朋友遇到這樣的情況
當程序退出後
通過Windows的
資源管理器
看到的是進程數目並沒有減少
這是因為程序中使用的線程可能並沒有有效退出
雖然Thread類中提供了
Abort
方法用以中止進程
但並不能夠保證成功退出
因為進程中使用的某些資源並沒有回收
在某些情況下垃圾回收器也不能保證完全的回收資源
還是需要我們自己手動回收資源的
在本文介紹的程序中也涉及到資源手動回收的問題
實現方法可參閱下面具體實現步驟中的第十二步
三.具體步驟 在了解
掌握了上面的關鍵問題及其解決方法後
再實現用Visual C#實現網絡點對點通訊程序相對就容易許多
下面是具體的實現步驟
啟動Visual Studio
Net
並新建一個Visual C#項目
名稱為【Visual C#實現網絡點對點通訊程序】
在Visual Studio
Net集成開發環境中的【解決方案資源管理器】窗口中
雙擊Form
cs文件
進入Form
cs文件的編輯界面
在Form
cs文件的開頭
用下列導入命名空間代碼替代系統缺省的導入命名空間代碼
using System ;
using System
Drawing ;
using System
Collections ;
using System
ComponentModel ;
using System
Windows
Forms ;
using System
Data ;
using System
Net
Sockets ;
using System
Net ;
using System
IO ;
using System
Text ;
using System
Threading ;
再把Visual Studio
Net的當前窗口切換到【Form
cs(設計)】窗口
並從【工具箱】中的【Windows窗體組件】選項卡中往窗體中拖入下列組件
四個Button組件
二個ListBox組件
四個TextBox組件
一個StatusBar組件
五個Label組件
並在四個Button組件拖入窗體後
分別在窗體設計界面中雙擊它們
則系統會在Form
cs文件中分別產生這四個組件的Click事件對應的處理代碼
在【解決方案資源管理器】窗口中
雙擊Form
cs文件
進入Form
cs文件的編輯界面
以下面代碼替代系統產生的InitializeComponent過程
下面代碼是對上面添加的組件進行初始化
private void InitializeComponent ( )
{
this
listBox
= new System
Windows
Forms
ListBox ( ) ;
this
textBox
= new System
Windows
Forms
TextBox ( ) ;
this
label
= new System
Windows
Forms
Label ( ) ;
this
label
= new System
Windows
Forms
Label ( ) ;
this
textBox
= new System
Windows
Forms
TextBox ( ) ;
this
button
= new System
Windows
Forms
Button ( ) ;
this
textBox
= new System
Windows
Forms
TextBox ( ) ;
this
label
= new System
Windows
Forms
Label ( ) ;
this
label
= new System
Windows
Forms
Label ( ) ;
this
label
= new System
Windows
Forms
Label ( ) ;
this
button
= new System
Windows
Forms
Button ( ) ;
this
button
= new System
Windows
Forms
Button ( ) ;
this
button
= new System
Windows
Forms
Button ( ) ;
this
textBox
= new System
Windows
Forms
TextBox ( ) ;
this
statusBar
= new System
Windows
Forms
StatusBar ( ) ;
this
statusBarPanel
= new System
Windows
Forms
StatusBarPanel( );
this
statusBarPanel
= new System
Windows
Forms
StatusBarPanel( );
this
label
= new System
Windows
Forms
Label ( ) ;
this
listBox
= new System
Windows
Forms
ListBox ( ) ;
( ( System
ComponentModel
ISupportInitialize )
( this
statusBarPanel
) )
BeginInit ( ) ;
( ( System
ComponentModel
ISupportInitialize )
( this
statusBarPanel
) )
BeginInit ( ) ;
this
SuspendLayout ( ) ;
this
listBox
ItemHeight =
;
this
listBox
Location = new System
Drawing
Point (
) ;
this
listBox
Name =
listBox
;
this
listBox
Size = new System
Drawing
Size (
) ;
this
listBox
TabIndex =
;
this
textBox
Location = new System
Drawing
Point (
) ;
this
textBox
Name =
textBox
;
this
textBox
Size = new System
Drawing
Size (
) ;
this
textBox
TabIndex =
;
this
textBox
Text =
;
this
label
Location = new System
Drawing
Point (
) ;
this
label
Na
From:http://tw.wingwit.com/Article/program/net/201311/13042.html