下面的示例使用 UdpClIEnt 偵聽端口8080 上的多路廣播地址組 10.0.0.1 的 UDP 數據文報廣播。它接收消息字符串並將消息寫入控制台。
例:在IDE新建一個工程項目,窗體類命名為FormChat,在窗體上放一個控件ListBox,用於接收消息,放一個TextBox控件用於輸入要發送的消息,放一個Button用於發送消息。全源代碼如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
namespace WinUDPChat
{
///
/// Form1 的摘要說明。
///
public class FormChat : System.Windows.Forms.Form
{
///
/// 必需的設計器變量。
///
private System.ComponentModel.Container components = null;
private static UdpClient m_Client;
//private static UdpClIEnt m_Server;
private static int ListenerPort = 8080;
private static int SenderPort = 8080;
private static int LocalPort;
private static int RemotePort;
private static string m_szHostName;
private static IPAddress m_GroupAddress_C;
private static IPAddress m_GroupAddress_S;
private static IPHostEntry m_LocalHost;
private static IPEndPoint m_RemoteEP;
private System.Windows.Forms.Button button_sendMSG;
private System.Windows.Forms.TextBox textBox_msg;
private System.Windows.Forms.ListBox listBox_msg;
private Thread th;
public FormChat()
{
//
// Windows 窗體設計器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調用後添加任何構造函數代碼
//
}
///
/// 清理所有正在使用的資源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗體設計器生成的代碼
///
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
///
private void InitializeComponent()
{
this.button_sendMSG = new System.Windows.Forms.Button();
this.textBox_msg = new System.Windows.Forms.TextBox();
this.listBox_msg = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// button_sendMSG
//
this.button_sendMSG.Location = new System.Drawing.Point(96, 234);
this.button_sendMSG.Name = "button_sendMSG";
this.button_sendMSG.TabIndex = 0;
this.button_sendMSG.Text = "發送";
this.button_sendMSG.Click += new System.EventHandler(this.button_sendMSG_Click);
//
// textBox_msg
//
this.textBox_msg.Location = new System.Drawing.Point(80, 197);
this.textBox_msg.Name = "textBox_msg";
this.textBox_msg.TabIndex = 1;
this.textBox_msg.Text = "";
//
// listBox_msg
//
this.listBox_msg.ItemHeight = 12;
this.listBox_msg.Location = new System.Drawing.Point(21, 22);
this.listBox_msg.Name = "listBox_msg";
this.listBox_msg.Size = new System.Drawing.Size(248, 136);
this.listBox_msg.TabIndex = 2;
//
// FormChat
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClIEntSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.listBox_msg);
this.Controls.Add(this.textBox_msg);
this.Controls.Add(this.button_sendMSG);
this.Name = "FormChat";
this.Text = "聊天室";
this.Load += new System.EventHandler(this.FormChat_Load);
this.Closed += new System.EventHandler(this.FormChat_Closed);
this.ResumeLayout(false);
}
#endregion
///
/// 應用程序的主入口點。
///
[STAThread]
static void Main()
{
Application.Run(new FormChat());
}
private void FormChat_Load(object sender, System.EventArgs e)
{
LocalPort = SenderPort;
RemotePort = ListenerPort;
m_szHostName = Dns.GetHostName();
m_LocalHost = Dns.GetHostByName(m_szHostName);
Initialize();
th = new Thread(new ThreadStart(Listener));
th.Start();
}
public void Terminate()
{
m_Client.DropMulticastGroup(m_GroupAddress_C);
}
public void Initialize()
{
//
// 實例化 UdpCLient
//
m_Client = new UdpClIEnt(LocalPort);
//
// 創建對方主機的終結點
//
m_GroupAddress_S = IPAddress.Parse("10.0.0.1"); //要發送到的計算機IP
m_RemoteEP = new IPEndPoint( m_GroupAddress_S, RemotePort );
}
public void Listener()
{
//
// 創建多路廣播組對象
//
System.Net.IPHostEntry localhost =Dns.GetHostByName(Dns.GetHostName());
string local_IP= localhost.AddressList[0].ToString();//接收消息的本地IP,用於監聽
m_GroupAddress_C = IPAddress.Parse(local_IP);
//
// 聯接組
//
try
{
m_Client.JoinMulticastGroup(m_GroupAddress_C, 100); //不添加到多路廣播組也可以
}
catch(Exception err)
{
throw(err);//無法聯接多路廣播組
}
//
// 偵聽器等待數據到來
// 並用緩沖區保存它。
Thread.Sleep(2000); // 確保 client2 正在接收
Encoding ASCII = Encoding.ASCII;
// while(!m_Done)
while(true)
{
IPEndPoint endpoint = null;
//endpoint = new IPEndPoint(m_GroupAddress_C,LocalPort);//這句代碼不要也可以
Byte[] data = m_Client.Receive(ref endpoint);
String strData = ASCII.GetString(data);
listBox_msg.Items.Add(strData);
}
}
private void FormChat_Closed(object sender, System.EventArgs e)
{
try
{
try
{
if(th!=null)
{
if(th.IsAlive)
{
th.Abort();
}
th=null;
}
}
catch
{
try
{
System.Threading.Thread.ResetAbort();
}
catch
{}
}
Terminate();
m_Client.Close();
}
catch
{
}
}
private void button_sendMSG_Click(object sender, System.EventArgs e)
{
Byte [] buffer = null;
Encoding ASCII = Encoding.ASCII;
string s = textBox_msg.Text;
buffer = new Byte[s.Length + 1];
//
// 將數據發送給遠程對方主機
//
int len = ASCII.GetBytes( s.ToCharArray(), 0, s.Length, buffer, 0);
int ecode = m_ClIEnt.Send(buffer, len, m_RemoteEP);
}
}
}