服務器端對象類庫:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace UdpChatExample
{
///
/// UDP服務器對象
///
public class UDPServerClass
{
public delegate void MessageHandler(string Message);//定義委托事件
public event MessageHandler MessageArrived;
public UDPServerClass()
{
//獲取本機可用IP地址
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress ipa in ips)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
{
MyIPAddress = ipa;//獲取本地IP地址
break;
}
}
Note_StringBuilder = new StringBuilder();
PortName = 8080;
}
public UdpClient ReceiveUdpClient;
///
/// 偵聽端口名稱
///
public int PortName;
///
/// 本地地址
///
public IPEndPoint LocalIPEndPoint;
///
/// 日志記錄
///
public StringBuilder Note_StringBuilder;
///
/// 本地IP地址
///
public IPAddress MyIPAddress;
public void Thread_Listen()
{
//創建一個線程接收遠程主機發來的信息
Thread myThread = new Thread(ReceiveData);
myThread.IsBackground = true;
myThread.Start();
}
///
/// 接收數據
///
private void ReceiveData()
{
IPEndPoint local = new IPEndPoint(MyIPAddress, PortName);
ReceiveUdpClient = new UdpClient(local);
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
//關閉udpClient 時此句會產生異常
byte[] receiveBytes = ReceiveUdpClient.Receive(ref remote);
string receiveMessage = Encoding.Default.GetString(receiveBytes, 0, receiveBytes.Length);
// receiveMessage = ASCIIEncoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length);
MessageArrived(string.Format("{0}來自{1}:{2}", DateTime.Now.ToString(), remote, receiveMessage));
//try
//{
// Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
// ReceiveUdpClient.Send(sendBytes, sendBytes.Length, local);
//}
//catch (Exception e)
//{
//}
//break;
}
catch
{
break;
}
}
}
///
/// 添加日志信息到Note_StringBuilder
///
public void AddMessage_Note_StringBuilder()
{
}
}
}
界面簡單代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace UdpChatExample
{
public partial class UDPServerForm : Form
{
public UDPServerForm()
{
InitializeComponent();
}
public delegate void DelegateChangeText(string Messages);
void ChangeTxt(string Messages)
{
string SBText = SB.ToString();
SB.Remove(0, SB.Length);
SB.Append(Messages + "\r\n" + SBText);
richTextBox1.Text = SB.ToString();
}
StringBuilder SB = new StringBuilder();
private void UDPServerForm_Load(object sender, EventArgs e)
{
}
UDPServerClass UDPServerClass1;
private void button1_Click(object sender, EventArgs e)
{
UDPServerClass1 = new UDPServerClass();
UDPServerClass1.Thread_Listen();
UDPServerClass1.MessageArrived += new UDPServerClass.MessageHandler(UDPServerClass1_MessageArrived);
}
void UDPServerClass1_MessageArrived(string Message)
{
richTextBox1 .Invoke (new DelegateChangeText(ChangeTxt),Message);
}
private void UDPServerForm_FormClosing(object sender, FormClosingEventArgs e)
{
System.Environment.Exit(System.Environment.ExitCode);
}
}
}
