转自:http://blog.youkuaiyun.com/adamchin/article/details/6295010
服务端:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace UdpServer
- {
- public partial class UdpServer : Form
- {
- //创建一个Thread类
- private Thread thread1;
- //创建一个UdpClient对象,来接收消息
- private UdpClient udpReceive;
- private UdpClient udpSend;
- public UdpServer()
- {
- InitializeComponent();
- }
- private void BtnSend_Click(object sender, EventArgs e)
- {
- //初始化UdpClient
- udpSend = new UdpClient();
- //允许发送和接收广播数据报
- udpSend.EnableBroadcast = true;
- //必须使用组播地址范围内的地址
- IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.100.0.10"), 8001);
- //将发送内容转换为字节数组
- byte[] bytes = System.Text.Encoding.UTF8.GetBytes(TbxMessage.Text);
- //设置重传次数
- int retry = 0;
- while (true)
- {
- try
- {
- //发送组播信息
- udpSend.Send(bytes, bytes.Length, iep);
- break;
- }
- catch
- {
- if (retry < 3)
- {
- retry++; continue;
- }
- else
- {
- DialogResult result = MessageBox.Show("发送失败!");
- break;
- }
- }
- }
- //清空TbxMesage中的内容
- TbxMessage.Clear();
- //光标还原
- TbxMessage.Focus();
- }
- private void ReceiveMessage()
- {
- //在本机指定的端口接收
- IPEndPoint remoteIpEndIPoint = new IPEndPoint(IPAddress.Any, 8002);
- udpReceive = new UdpClient(remoteIpEndIPoint);
- IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
- //接收从远程主机发送过来的信息
- while (true)
- {
- //ref表示引用类型的 IPPoint实例接收消息
- byte[] receiveBytes = udpReceive.Receive(ref iep);
- string returnData = Encoding.UTF8.GetString(receiveBytes);
- string message = "来自" + iep.ToString() + "的消息";
- //显示消息 并以message为消息的标题
- DialogResult result = MessageBox.Show(returnData, message);
- }
- }
- private void UdpServer_Load(object sender, EventArgs e)
- {
- //初始化该线程并指定线程执行时要调用的方法
- thread1 = new Thread(new ThreadStart(ReceiveMessage));
- //启动线程
- thread1.Start();
- }
- private void UdpServer_FormClosing(object sender, FormClosingEventArgs e)
- {
- //关闭UdpClient连接
- udpReceive.Close();
- udpSend.Close();
- //终止线程
- thread1.Abort();
- }
- }
- }
客户端:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- namespace myUdpClient
- {
- public partial class myUdpClient : Form
- {
- //创建一个Thread实例
- private Thread thread1;
- //创建一个UdpClient实例
- private UdpClient udpReceive;
- private UdpClient udpSend;
- private byte[] bytes;
- //private DialogResult result;
- public myUdpClient()
- {
- InitializeComponent();
- }
- private void myUdpClient_Load(object sender, EventArgs e)
- {
- thread1 = new Thread(new ThreadStart(ReceiveMessage));
- thread1.Start();
- }
- private void ReceiveMessage()
- {
- //在本机指定的端口接收
- udpReceive = new UdpClient(8001);
- //将套接字加入组播组
- udpReceive.JoinMulticastGroup(IPAddress.Parse("224.100.0.10"), 50);
- //接收从远程主机发送过来的信息
- IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
- while (true)
- {
- //ref表示引用类型的 IPPoint实例接收消息
- try
- {
- bytes = udpReceive.Receive(ref iep);
- }
- catch (SocketException e)
- {
- DialogResult result = MessageBox.Show("发送失败!");
- }
- string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
- string message = "来自" + iep.ToString() + "的消息";
- //显示消息 并以message为消息的标题
- DialogResult res = MessageBox.Show(str, message);
- }
- }
- private void BtnSend_Click(object sender, EventArgs e)
- {
- //初始化UdpClient
- udpSend = new UdpClient();
- //实际使用时应将127.0.0.1改为服务器的远程IP
- IPAddress remoteIPAddress = IPAddress.Parse("127.0.0.1");
- IPEndPoint remoteIPEndPoint = new IPEndPoint(remoteIPAddress, 8002);
- //将发送内容转换为字节数组
- byte[] bytes = System.Text.Encoding.UTF8.GetBytes(TbxMessage.Text);
- //设置重传次数
- int retry = 0;
- while (true)
- {
- try
- {
- udpSend.Send(bytes, bytes.Length, remoteIPEndPoint);
- break;
- }
- catch (SocketException se)
- {
- if (retry < 3)
- {
- retry++; continue;
- }
- else
- {
- DialogResult result = MessageBox.Show("发送失败!");
- break;
- }
- }
- }
- //清空TbxMesage中的内容
- TbxMessage.Clear();
- //光标还原
- TbxMessage.Focus();
- //关闭UdpClient
- }
- private void myUdpClient_FormClosing(object sender, FormClosingEventArgs e)
- {
- //关闭连接
- udpReceive.Close();
- udpSend.Close();
- //终止线程
- thread1.Abort();
- }
- }
- }