using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace UDP编程
{
public partial class Form1 : Form
{
//创建一个接收一个发送UdpClient 类
private UdpClient sendudpClient;
private UdpClient receiveudpClient;
public Form1()
{
InitializeComponent();
//获得指定的主机的 Internet 协议 (IP) 地址。
IPAddress[] ips = Dns.GetHostAddresses("");
foreach(var ip in ips)
{
textBox1.Text = ip.ToString();
textBox2.Text = ip.ToString();
break;
}
//端口号
int port = 51882;
int sender = 11882;
textBox3.Text = port.ToString();
textBox4.Text = sender.ToString();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//// 接受消息
private void button4_Click(object sender, EventArgs e)
{
// 创建接收IP地址
IPAddress localIp = IPAddress.Parse(textBox1.Text);
//加上端口号
IPEndPoint LocaliPEndPoint = new IPEndPoint(localIp, int.Parse(textBox3.Text));
try
{
//初始化 UdpClient 类的新实例
receiveudpClient = new UdpClient(LocaliPEndPoint);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
//另起一个线程调用接收方法
Thread recethread = new Thread(ReceiveMessage);
recethread.Start();
}
//接收消息的方法
private void ReceiveMessage()
{
if (receiveudpClient == null) { return; }
//网络端点表示为IP 地址和端口号,设置成任何都可以
IPEndPoint remoteIpendPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
try
{
//接收由一台远程主机发送的 UDP 数据报
byte[] recbyte = receiveudpClient.Receive(ref remoteIpendPoint);
//将byte转换成string
string message = Encoding.Unicode.GetString(recbyte);
//利用委托实现跨线程界面操作
ShowMessage(listBox1, string.Format("{0}[{1}]", remoteIpendPoint, message));
} catch(Exception ex) { }
}
}
//定义一个委托
delegate void ShowMessageCallBack(ListBox listBox, string message);
//实现方法
private void ShowMessage(ListBox listBox,string text)
{
//当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它
if (listBox.InvokeRequired)
{
ShowMessageCallBack showMessageCallBack = ShowMessage;
listBox.Invoke(showMessageCallBack, new object[] { listBox, text });
}
else
{
listBox1.Items.Add(text);
listBox1.SelectedIndex = listBox1.Items.Count - 1;
listBox1.ClearSelected();
}
}
//发送消息
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox5.Text))
{
MessageBox.Show("发送消息不能为空");
return;
}
IPAddress localIp = IPAddress.Parse(textBox1.Text);
IPEndPoint iPEndPoint = new IPEndPoint(localIp, int.Parse(textBox3.Text));
sendudpClient = new UdpClient(iPEndPoint);
Thread thread = new Thread(SendMessage);
thread.Start(textBox5.Text);
}
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] sendbyte = Encoding.Unicode.GetBytes(message);
IPAddress iPAddress = IPAddress.Parse(textBox2.Text);
IPEndPoint iPEnd = new IPEndPoint(iPAddress, int.Parse(textBox4.Text));
sendudpClient.Send(sendbyte, sendbyte.Length, iPEnd);
sendudpClient.Close();
ResetMessage(textBox5);
}
delegate void ResetMessageCallBack(TextBox text);
private void ResetMessage(TextBox text)
{
if (text.InvokeRequired)
{
ResetMessageCallBack resetMessageCallBack = ResetMessage;
text.Invoke(resetMessageCallBack, new object[] { text });
}
else
{
textBox5.Clear();
textBox5.Focus();
}
}
private void button3_Click(object sender, EventArgs e)
{
receiveudpClient.Close();
}
private void button2_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
}
}
}