程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Visual C#實現Windows信使服務

Visual C#實現Windows信使服務

編輯:關於C語言
visual|window  現在有很多網絡管理軟件都具備網絡上信息實時傳送的功能,雖然有些網絡通訊軟件功能比較強大,有的軟件不僅可以傳送文本信息,還可以傳送二進制文件等。但它們都有一個無法克服的缺點,那就是分發比較困難,信息傳送雙方計算機都需要安裝通訊軟件的客戶端和服務器端軟件,並且只有但雙方都打開相應軟件時,才可能進行信息傳送。而信使通訊就可以克服上述缺點,由於信使服務在Windows 2000系統以上都是自帶的,並且此服務在安裝完Windows 2000以上後的缺省狀態是打開的。所以只要網絡的二台計算機安裝Windows 2000以上系統,不再需要安裝其他軟件,就可以通過此服務實現信息傳送了。當然這種網絡信息傳送分發也有先天不足,就是只能傳送文本信息,如果您需要傳送二進制文件等復雜的信息或數據,就無法使用這種方法了。

  一.簡介Windows的信使服務及其使用方法:

  首先進入"控制面板",在"管理工具"中選擇"服務"後,就可以得到如圖01所示界面,圖01就是Windows服務的運行窗口:


圖01:計算機Windows"服務"運行界面

  信使服務在Windows操作系統中對應的服務名稱是"Messager"。Windows操作系統給此服務的定義是"發送和接收系統管理員或者"警報器"服務傳遞的消息。"在缺省狀態信使服務是啟動的,如果發現它處於"停止"或者"已禁用"狀態,請啟動它,因為後面介紹的程序能夠正常運行的條件之一就算此服務處於"啟動"狀態。

  利用Windows系統也可以通過信使服務發送信息,具體操作如下:

  1. 在"桌面"上選中"我的電腦"後,單擊鼠標右鍵,在彈出的菜單中選擇"管理"後,彈出"計算機管理"對話框:

  2. 打開"共享文件夾",選中"共享"後,單擊鼠標右鍵,在彈出的菜單中選擇"所有任務"中的"發送控制台消息",具體如圖02所示,當完成以上操作就可以得到如圖03所示界面:


圖02:利用"信使服務"實現信息發送界面之一

  3. 在圖03所示界面中,單擊"添加"按鈕,輸入要發送到的計算機的IP地址或主機名稱,在"消息"文本框中輸入要發送的信息後,單擊"發送"按鈕,則信息就通過信使服務發送到對方了。


圖03:利用"信使服務"實現信息發送界面之一

  以上就是利用Windows的自身的信使服務來發送信息的具體步驟。

  二.Visual C#通過信使服務實現網絡信息傳送關鍵技術:

  雖然.Net FrameWork SDK中提供了許多開發網絡程序的類庫,但這些類庫中卻沒有提供調用信史服務的方法,所以要調用信史方法只有使用WinAPI函數,這個WinAPI函數NetMessageBufferSend,它位於"Netapi32.dll"文件中。以下就是NetMessageBufferSend函數在Visual C#中的聲明方法:

[DllImport ( "Netapi32" , CharSet = CharSet.Unicode ) ]
public static extern int NetMessageBufferSend (
string servername , //服務器名稱,為NULL
string fromname , //接收方名稱,可為IP或計算機名稱
string msgname , //信息名稱,為NULL
string buf , //信息
int buflen ) ; //信息長度


  對照NetMessageBufferSend函數參數分別輸入相應的接收方名稱和信息內容即可,可見NetMessageBufferSend的使用方法還是非常簡單的。下面就來詳細介紹Visual C#通過信史服務實現網絡信息傳送的具體實現方法。

  三.本文中的程序設計、調試和運行的環境:

  (1).微軟公司視窗2000服務器版。

  (2).Visual Studio .Net 2003企業構建版,.Net FrameWork SDK 1.1版本號4322。

  四.Visual C#通過信史服務實現網絡信息傳送的具體實現步驟:

  以下就是Visual C#通過信史服務實現網絡信息傳送的具體實現步驟:

  1. 啟動Visual Studio .Net。

  2. 選擇菜單【文件】|【新建】|【項目】後,彈出【新建項目】對話框。

  3. 將【項目類型】設置為【Visual C#項目】。

  4. 將【模板】設置為【Windows應用程序】。

  5. 在【名稱】文本框中輸入【Visual C#實現通訊信使】。

  6. 在【位置】的文本框中輸入【E:\VS.NET項目】,然後單擊【確定】按鈕。這樣在"E:\VS.Net項目"目錄中就創建了一個名稱為"Visual C#實現通訊信使"的文件夾,裡面存放的就是"Visual C#實現通訊信使"項目的所有文件。

  7. 把Visual Studio .Net的當前窗口切換到【Form1.cs(設計)】窗口,並從【工具箱】中的【Windows窗體組件】選項卡中往設計窗體中拖入下列組件,並執行相應操作:

  二個Lable組件。

  二個TextBox組件,分別用來輸入接收方的IP地址或計算機名和發送信息內容。

  一個Button按鈕,並在這個組件拖入設計窗口後分別雙擊它們,則系統會在Form1.cs中分別產生這一個組件Click事件對應的處理代碼。

  8. 把Visual Studio .Net的當前窗口切換到Form1.cs的代碼編輯窗口,在Form1.cs的首部的引入命名空間的代碼區中,用下列代碼替換Form1.cs中由系統自動產生的引入命名空間代碼:

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Runtime.InteropServices ;
//申明WinAPI函數需要使用到此命名空間


  9. 以下面代碼替代系統產生的InitializeComponent過程。下面代碼是對加入窗體的組件以及創建的全局變量進行初始化和定義一個Button組件的Click事件:

private void InitializeComponent ( )
{
 this.textBox1 = new System.Windows.Forms.TextBox ( ) ;
 this.textBox2 = new System.Windows.Forms.TextBox ( ) ;
 this.button1 = new System.Windows.Forms.Button ( ) ;
 this.label1 = new System.Windows.Forms.Label ( ) ;
 this.label2 = new System.Windows.Forms.Label ( ) ;
 this.SuspendLayout ( ) ;
 this.textBox1.Location = new System.Drawing.Point ( 124 , 58 ) ;
 this.textBox1.Name = "textBox1" ;
 this.textBox1.Size = new System.Drawing.Size ( 212 , 21 ) ;
 this.textBox1.TabIndex = 0 ;
 this.textBox1.Text = "" ;
 this.textBox2.Location = new System.Drawing.Point ( 124 , 126 ) ;
 this.textBox2.Multiline = true ;
 this.textBox2.Name = "textBox2" ;
 this.textBox2.Size = new System.Drawing.Size ( 212 , 82 ) ;
 this.textBox2.TabIndex = 1 ;
 this.textBox2.Text = "" ;
 this.button1.Location = new System.Drawing.Point ( 122 , 232 ) ;
 this.button1.Name = "button1" ;
 this.button1.Size = new System.Drawing.Size ( 106 , 36 ) ;
 this.button1.TabIndex = 3 ;
 this.button1.Text = "發送" ;
 this.button1.Click += new System.EventHandler ( this.button1_Click ) ;
 this.label1.Location = new System.Drawing.Point ( 8 , 66 ) ;
 this.label1.Name = "label1" ;
 this.label1.Size = new System.Drawing.Size ( 132 , 23 ) ;
 this.label1.TabIndex = 4 ;
 this.label1.Text = "IP地址或計算機名:" ;
 this.label2.Location = new System.Drawing.Point ( 78 , 134 ) ;
 this.label2.Name = "label2" ;
 this.label2.Size = new System.Drawing.Size ( 46 , 23 ) ;
 this.label2.TabIndex = 5 ;
 this.label2.Text = "內容:" ;
 this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
 this.ClIEntSize = new System.Drawing.Size ( 356 , 297 ) ;
 this.Controls.Add ( this.button1 ) ;
 this.Controls.Add ( this.textBox2 ) ;
 this.Controls.Add ( this.textBox1 ) ;
 this.Controls.Add ( this.label2 ) ;
 this.Controls.Add ( this.label1 ) ;
 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle ;
 this.MaximizeBox = false ;
 this.Name = "Form1" ;
 this.Text = "Visual C#實現通訊信使" ;
 this.ResumeLayout ( false ) ;
}


  至此【Visual C#實現通訊信使】項目的界面設計和功能實現的前期工作就完成了,設計界面如圖04所示:


圖04:【Visual C#實現通訊信使】項目的設計界面

  10. 在Form1.cs中的Main過程之後添加下列代碼,下列代碼的作用是定義button1的Click事件,在此事件中調用申明的NetMessageBufferSend函數,把信息通過信史服務傳送到指定的網絡計算機上去:

private void button1_Click ( object sender , System.EventArgs e )
{
 byte [ ] bBuffer = System.Text.Encoding.Unicode.GetBytes ( textBox2.Text );
 int nRet = NetMessageBufferSend ( null , textBox1.Text , null , textBox2.Text , textBox2.Text.Length * 2 + 2 ) ;
}


  11. 在添加完button1的Click事件後,再添加下列代碼,下列代碼的作用是申明NetMessageBufferSend函數:

[DllImport ( "Netapi32" , CharSet = CharSet.Unicode ) ]
public static extern int NetMessageBufferSend (
 string servername , //服務器名稱,為NULL
 string fromname , //接收方名稱,可為IP或計算機名稱
 string msgname , //信息名稱,為NULL
 string buf , //信息
 int buflen ) ; //信息長度


  至此,在上述步驟都正確完成,並全部保存後,【Visual C#實現通訊信使】項目的全部工作就完成了。此時單擊快捷鍵【F5】運行程序後,在【IP地址或計算機名:】文本框中輸入對方的IP地址或計算機名,在【內容:】文本框中輸入要傳送的信息後,單擊【發送】按鈕,則程序就會把輸入的信息傳送到指定的網絡計算機上了。

  五.總結:

  Visual C#通過信史服務實現網絡信息傳送的關鍵是要了解、掌握NetMessageBufferSend函數在Visual C#中的申明、調用方法,雖然.Net推出以及三年多了,但仍有很多不完善的地方,有時要借助於COM,有時要借助於WinAPI函數才能順利解決,本文就是一個典型的例子。我想隨著時間的推移,.Net FrameWork SDK一定會更加完善,NetMessageBufferSend等WinAPI函數一定也會在其中找到相應的位置,這樣也就減少了程序員的工作難度,也給程序帶來更高的穩定性。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved