1、UDP通信
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace PtLib
{
public delegate void UdpReceivedEventHandler(UdpStateEventArgs args);
public class UdpClass
{
public event UdpReceivedEventHandler UdpReceived;
CancellationTokenSource tokensource = new CancellationTokenSource();
private UdpClient udpClient;
private string _ip = "127.0.0.1";
private int _port = 9080;
public UdpClass(string ip,int port)
{
_ip = ip;
_port = port;
}
/// <summary>
/// 启动UDP
/// </summary>
/// <param name="localIp"></param>
/// <param name="localPort"></param>
public void Start()
{
IPEndPoint localPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);
udpClient = new UdpClient(localPoint);
CancellationToken cancellationToken = tokensource.Token;
Task.Run(() =>
{
while (!cancellationToken.IsCancellationRequested)
{
UdpStateEventArgs args = new UdpStateEventArgs();
if (udpClient != null)
{
//IPEndPoint remotePoint = new IPEndPoint(IPAddress.Parse(remoteIp), remotePort);
IPEndPoint remotePoint = new IPEndPoint(IPAddress.Any, 0);
var received = udpClient.Receive(ref remotePoint);
args.remoteEndPoint = remotePoint;
args.buffer = received;
UdpReceived?.Invoke(args);
}
else
{
break;
}
}
}, cancellationToken);
}
/// <summary>
/// 关闭接收处理
/// </summary>
public void Close()
{
try
{
tokensource.Cancel();
udpClient.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void Send(byte[] data,string remoteIp,int remotePort)
{
if(udpClient == null)
{
IPEndPoint localPoint = new IPEndPoint(IPAddress.Parse(_ip), _port);
udpClient = new UdpClient(localPoint);
}
IPEndPoint remotePoint = new IPEndPoint(IPAddress.Parse(remoteIp), remotePort);
udpClient.Send(data, data.Length, remotePoint);
}
}
/// <summary>
/// 事件变量参数类
/// </summary>
public class UdpStateEventArgs : EventArgs
{
public IPEndPoint remoteEndPoint;
public byte[] buffer = null;
}
}
2、应用调用
using PtLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UdpDemo
{
public partial class MainForm : Form
{
UdpClass udpClass = null;
public MainForm()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
string localIp = tbLocalIp.Text.Trim();
int localPort=int.Parse(tbLocalPort.Text.Trim());
udpClass =new UdpClass(localIp, localPort);
udpClass.UdpReceived += UdpClass_UdpReceived;
udpClass.Start();
}
private void UdpClass_UdpReceived(UdpStateEventArgs args)
{
string str=Encoding.UTF8.GetString(args.buffer, 0, args.buffer.Length);
this.Invoke(new Action(() =>
{
lbxReceive.Items.Add(str);
}));
}
private void btnSend_Click(object sender, EventArgs e)
{
byte[] b = Encoding.UTF8.GetBytes(tbSend.Text.Trim());
string localIp = tbRemoteIp.Text.Trim();
int localPort = int.Parse(tbRemotePort.Text.Trim());
udpClass.Send(b, localIp, localPort);
}
}
}
3、实现效果