You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.2 KiB
87 lines
2.2 KiB
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 RobotLib
|
|
{
|
|
public class Com
|
|
{
|
|
private static readonly NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
|
|
private UdpClient udpClient;
|
|
private Thread thread;
|
|
|
|
public event EventHandler<MessageEventArgs> MessageReveived;
|
|
|
|
public Com()
|
|
{
|
|
}
|
|
|
|
public Com(string host, int port)
|
|
{
|
|
Connect(host, port);
|
|
}
|
|
|
|
public bool IsConnected { get; private set; }
|
|
|
|
|
|
public void Connect(string host, int port)
|
|
{
|
|
if (!IsConnected)
|
|
{
|
|
udpClient = new UdpClient();
|
|
udpClient.Connect(host, port);
|
|
IsConnected = true;
|
|
|
|
thread = new Thread(Run);
|
|
thread.IsBackground = true;
|
|
thread.Start();
|
|
}
|
|
}
|
|
|
|
public void Disconnect()
|
|
{
|
|
IsConnected = false;
|
|
if (thread != null)
|
|
{
|
|
thread.Interrupt();
|
|
thread.Join();
|
|
}
|
|
}
|
|
|
|
public void Run()
|
|
{
|
|
while(IsConnected)
|
|
{
|
|
try
|
|
{
|
|
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
|
|
byte[] dataReceived = udpClient.Receive(ref remote);
|
|
string msg = Encoding.ASCII.GetString(dataReceived);
|
|
log.Trace($"Msg received from {remote}: {msg}");
|
|
MessageReveived?.Invoke(this, new MessageEventArgs(msg));
|
|
}
|
|
catch (ThreadInterruptedException)
|
|
{
|
|
return;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
log.Fatal(ex, "Exception in Receiver-Thread\r\n" + ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SendMsg(string msg)
|
|
{
|
|
byte[] data = Encoding.ASCII.GetBytes(msg);
|
|
udpClient.Send(data, data.Length);
|
|
log.Trace($"Msg sent to {udpClient.Client.RemoteEndPoint}: {msg}");
|
|
}
|
|
|
|
}
|
|
}
|
|
|