熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用Visual C#實現局域網點對點通訊

2013-11-13 10:15:01  來源: .NET編程 

  點對點即PeerToPeer通常簡寫為PP所謂網絡中的點對點其實可以看成是一種對等的網絡模型PP其實是實現網絡上不同計算機之間不經過中繼設備直接交換數據或服務的一種技術PP由於允許網絡中任一台計算機可以直接連接到網絡中其他計算機並與之進行數據交換這樣既消除了中間環節也使得網絡上的溝通變得更容易更直接
  
  PP作為一種網絡的模型它有別於傳統的客戶/服務器模型客戶/服務器模型一般都有預定義的客戶機和服務器而在PP模型轉並沒有明確的客戶端和服務器但其實在PP模型中每一台計算機既可以看成是服務器也可以看成是客戶機在網絡中傳統上的客戶機/服務器通訊模型中發送服務請求或者發送數據的計算機一般稱為客戶機而接收處理服務或接收數據的計算機稱為服務器而在PP網絡模型中計算機不僅接收數據還有發送數據不僅提出服務請求還有接收對方的服務請求
  
  在下面介紹的用Visual C#實現的局域網點對點通訊程序就有如下特點在網絡利用此通訊程序進行通訊的任一計算機在通訊之前都需要偵聽端口號接受其他機器的連接申請並在連接建立後就可以接收對方發送來的數據同時也可以向其他機器提出連接申請並在對方計算機允許建立連接請求後發送數據到對方可見在網絡中利用此軟件進行PP網絡通訊的任一計算機既是客戶機同樣也是服務器
  
  一.程序的設計調試運行的軟件環境
  
  (微軟公司視窗服務器版
  
  (Visual Studio Net正式版Net FrameWork SDK版本號
  
  二.關鍵步驟及其解決方法
  
  關鍵步驟就是實現信息在網絡中的發送和接收數據接收使用的是Socket數據發送使用的是NetworkStream
  
  利用Socket來接收信息
  
  為了更清楚的說明問題程序在處理數據發送和接收時采用了不通的端口號發送數據程序在缺省狀態設定的端口號為下面代碼是偵聽端口號接受網絡中對此端口號的連接請求並在建立連接後通過Socket接收遠程計算機發送來的數據
  
  try
  {
  TcpListener tlListen = new TcpListener ( ) ;
  //偵聽端口號
  tlListenStart ( ) ;
  Socket skSocket = tlListenAcceptSocket ( );
  //接受遠程計算機的連接請求並獲得用以接收數據的Socket實例
  EndPoint tempRemoteEP = skSocketRemoteEndPoint;
  //獲得遠程計算機對應的網絡遠程終結點
  while (true)
  {
  Byte [] byStream = new Byte[];
  //定義從遠程計算機接收到數據存放的數據緩沖區
  int i = skSocketReceiveFrom(byStreamref tempRemoteEP);
  //接收數據並存放到定義的緩沖區中
  string sMessage = SystemTextEncodingUTFGetString(byStream);
  //以指定的編碼從緩沖區中解析出內容
  MessageBoxShow ( sMessage );
  //顯示傳送來的數據
  }
  }
  catch ( SystemSecuritySecurityException )
  {
  MessageBoxShow ( 防火牆安全錯誤!錯誤
  MessageBoxButtonsOK MessageBoxIconExclamation);
  }
  
  利用NetworkStream來傳送信息
  
  在使用StreamWriter處理NetworkStream傳送數據時數據傳送的編碼類型是UTF下列代碼是對IP地址為的計算機的端口號提出連接申請並在連接申請建立後以UTF編碼發送字符串您好見到您很高興到對方由於下列代碼中的注釋比較詳細這裡就不具體介紹了下列代碼也是使用NetworkStream傳送數據的典型代碼
  
  try
  {
  TcpClient tcpc = new TcpClient ();
  //對IP地址為的計算機的端口提出連接申請
  NetworkStream tcpStream = tcpcGetStream ( );
  //如果連接申請建立則獲得用以傳送數據的數據流
  }
  catch ( Exception )
  {
  MessageBoxShow ( 目標計算機拒絕連接請求! ) ;
  break ;
  }
  try
  {
  string sMsg = 您好見到您很高興 ;
  StreamWriter reqStreamW = new StreamWriter (tcpStream);
  //以特定的編碼往向數據流中寫入數據 默認為UTF編碼
  reqStreamWWrite (sMsg);
  //將字符串寫入數據流中
  reqStreamWFlush ( );
  //清理當前編寫器的所有緩沖區並使所有緩沖數據寫入基礎流
  }
  catch(Exception)
  {
  MessageBoxShow (無法發送信息到目標計算機!) ;
  }
  
  當然在具體用Visual C#實現網絡點對點通訊程序時還必須掌握很多其他方面的知識如資源的回收在用Visual C#編寫網絡應用程序的時候很多朋友遇到這樣的情況當程序退出後通過Windows的資源管理器看到的是進程數目並沒有減少這是因為程序中使用的線程可能並沒有有效退出雖然Thread類中提供了Abort方法用以中止進程但並不能夠保證成功退出因為進程中使用的某些資源並沒有回收在某些情況下垃圾回收器也不能保證完全的回收資源還是需要我們自己手動回收資源的在本文介紹的程序中也涉及到資源手動回收的問題實現方法可參閱下面具體實現步驟中的第十二步
  
  三.具體步驟
  
  在了解掌握了上面的關鍵問題及其解決方法後再實現用Visual C#實現網絡點對點通訊程序相對就容易許多下面是具體的實現步驟
  
  啟動Visual Studio Net並新建一個Visual C#項目名稱為【Visual C#實現網絡點對點通訊程序】
  
  在Visual Studio Net集成開發環境中的【解決方案資源管理器】窗口中雙擊Formcs文件進入Formcs文件的編輯界面
  
  在Formcs文件的開頭用下列導入命名空間代碼替代系統缺省的導入命名空間代碼
  
  using System ;
  using SystemDrawing ;
  using SystemCollections ;
  using SystemComponentModel ;
  using SystemWindowsForms ;
  using SystemData ;
  using SystemNetSockets ;
  using SystemNet ;
  using SystemIO ;
  using SystemText ;
  using SystemThreading ;
  
  再把Visual StudioNet的當前窗口切換到【Formcs(設計)】窗口並從【工具箱】中的【Windows窗體組件】選項卡中往窗體中拖入下列組件
  
  四個Button組件二個ListBox組件四個TextBox組件一個StatusBar組件五個Label組件並在四個Button組件拖入窗體後分別在窗體設計界面中雙擊它們則系統會在Formcs文件中分別產生這四個組件的Click事件對應的處理代碼
  
  在【解決方案資源管理器】窗口中雙擊Formcs文件進入Formcs文件的編輯界面以下面代碼替代系統產生的InitializeComponent過程下面代碼是對上面添加的組件進行初始化
  
  private void InitializeComponent ( )
  {
  thislistBox = new SystemWindowsFormsListBox ( ) ;
  thistextBox = new SystemWindowsFormsTextBox ( ) ;
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thistextBox = new SystemWindowsFormsTextBox ( ) ;
  thisbutton = new SystemWindowsFormsButton ( ) ;
  thistextBox = new SystemWindowsFormsTextBox ( ) ;
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thisbutton = new SystemWindowsFormsButton ( ) ;
  thisbutton = new SystemWindowsFormsButton ( ) ;
  thisbutton = new SystemWindowsFormsButton ( ) ;
  thistextBox = new SystemWindowsFormsTextBox ( ) ;
  thisstatusBar = new SystemWindowsFormsStatusBar ( ) ;
  thisstatusBarPanel = new SystemWindowsFormsStatusBarPanel( );
  thisstatusBarPanel = new SystemWindowsFormsStatusBarPanel( );
  thislabel = new SystemWindowsFormsLabel ( ) ;
  thislistBox = new SystemWindowsFormsListBox ( ) ;
  ( ( SystemComponentModelISupportInitialize )
  ( thisstatusBarPanel ) )BeginInit ( ) ;
  ( ( SystemComponentModelISupportInitialize )
  ( thisstatusBarPanel ) )BeginInit ( ) ;
  thisSuspendLayout ( ) ;
  thislistBoxItemHeight = ;
  thislistBoxLocation = new SystemDrawingPoint ( ) ;
  thislistBoxName = listBox ;
  thislistBoxSize = new SystemDrawingSize ( ) ;
  thislistBoxTabIndex = ;
  thistextBoxLocation = new SystemDrawingPoint ( ) ;
  thistextBoxName = textBox ;
  thistextBoxSize = new SystemDrawingSize ( ) ;
  thistextBoxTabIndex = ;
  thistextBoxText = ;
  thislabelLocation = new SystemDrawingPoint ( ) ;
  thislabelNa
From:http://tw.wingwit.com/Article/program/net/201311/13042.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.