public class UDPSocket
{
private Socket _client;
private string _remoteHost;
private int _remotePort;
private IPEndPoint _remoteEP;
private int _localPort;
private bool _isStopThread = false;
private Action<string> _cbReceiveMessage = null;
/// <summary>
///
/// </summary>
/// <param name="localPort">本地Port</param>
/// <param name="remoteHost">远程IP(目标主机IP)</param>
/// <param name="remotePort">远程Port(目标主机Port)</param>
/// <param name="cbReceiveMessage">接收消息回调</param>
public UDPSocket(int localPort,string remoteHost, int remotePort,Action<string> cbReceiveMessage)
{
_remoteHost = remoteHost;
_remotePort = remotePort;
_remoteEP = new IPEndPoint(IPAddress.Parse(_remoteHost), _remotePort);
_localPort = localPort;
_cbReceiveMessage = cbReceiveMessage;
//绑定本地端口
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, _localPort);
_client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_client.Bind(localEP);
//异步接收消息
Thread tdRecv = new Thread(OnRecvThread);
tdRecv.IsBackground = true;
tdRecv.Start();
}
public void Close()
{
_isStopThread = true;
if (_client != null) _client.Close();
_client = null;
}
private void OnRecvThread()
{
try
{
while (true)
{
if(_isStopThread)
{
return;
}
byte[] buffer = new byte[1024];
EndPoint point = new IPEndPoint(IPAddress.Any, 0);//保存发送方的ip和端口号
int length = _client.ReceiveFrom(buffer, ref point);//线程阻塞 接收消息
string msg = Encoding.ASCII.GetString(buffer, 0, length);//
if (_cbReceiveMessage != null)
_cbReceiveMessage(msg);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Send(string message)
{
byte[] data = Encoding.Default.GetBytes(message);//字符串与字节数组相互转换
_client.SendTo(data, _remoteEP); //发送信息
}
}