c# udp发送控制指令

superlxw 2013-07-17 10:19:38
我现在有一个串口采集的程序,是c#的,我现在想做一个程序,通过udp发送指令来控制这个采集的程序,我现在的思路是在这个采集程序里加一个监听端口的线程,请问该怎么加呢,另外就是怎么控制这个程序里的函数,比如最简单的,控制按钮的点击,最后实现的就是有两个程序,在新做的程序里点开始,然后这个采集的程序开始采集,点击结束就停止采集。谢谢各位大侠给点思路
...全文
340 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
procedurely 2013-07-18
  • 打赏
  • 举报
回复
引用 6 楼 superlxw 的回复:
[quote=引用 4 楼 procedurely 的回复:] 思路就是:利用多线程循环侦听某个端口以防止界面阻塞,当接收到消息之后根据消息的指令来做相应处理

public class SocketListener
{
    public event DltMessage EvtMessageReceived;// 接收到消息后事件
    private Thread work = null;
    private Socket socket = null;
    private int port = 11111;
        /// <summary>
        /// 开始监听
        /// </summary>
        public void StartListen()
        {
            work = new Thread(new ThreadStart(Start));
            work.IsBackground = true;
            work.Start();
        }
        public void Start()
        {
           try
            {
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
                using (receiveClient = new UdpClient(remoteEP))
                {
                    while (true)
                    {
                        try
                        {
                            //接收
                            byte[] bytes = receiveClient.Receive(ref remoteEP);
                            MessageReceived(bytes);
                            Thread.Sleep(100);
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine("接收udp消息错误,原因:" + e.Message);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 接收完消息后触发
        /// </summary>
        private void MessageReceived(byte [] bytes)
        {
            if (EvtMessageReceived != null)
            {
                EvtMessageReceived(bytes);
            }
        }
}
接收到消息后通过委托拿到结果,再进行处理,这里你需要定义消息的格式,比如包头+包体:0001|123456 0001为包头,123456为包体

public static void main()
{
    SocketListener sl = new SocketListener();
    sl.EvtMessageReceived += new DltMessage(MessageTransfer);
}
public void MessageTransfer(byte[] bytes)
{
    string msg = Encoding.Default.GetString(bytes);//这里需要注意编码格式,双方编码格式要一致
    string[] message = msg.Split('|');
    if(message[0].Equals("0001"))
     {
        //点击开始按钮...只要拿到了消息就可以为所欲为了
     }
}
请问DltMessage是什么啊,一个新创建的类?是不是要用delegate[/quote] DltMessage是定义的一个委托啊 public delegate void DltMessage(byte bytes)
procedurely 2013-07-18
  • 打赏
  • 举报
回复
不好意思,刚刚将UdpClient写错了,下面是更正后的代码:

public class SocketListener
{
    public event DltMessage EvtMessageReceived;// 接收到消息后事件
    private Thread work = null;
    private UdpClient receiveClient = null;
    private int port = 11111;
        /// <summary>
        /// 开始监听
        /// </summary>
        public void StartListen()
        {
            work = new Thread(new ThreadStart(Start));
            work.IsBackground = true;
            work.Start();
        }
        public void Start()
        {
           try
            {
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
                using (receiveClient = new UdpClient(remoteEP))
                {
                    while (true)
                    {
                        try
                        {
                            //接收
                            byte[] bytes = receiveClient.Receive(ref remoteEP);
                            MessageReceived(bytes);
                            Thread.Sleep(100);
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine("接收udp消息错误,原因:" + e.Message);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 接收完消息后触发
        /// </summary>
        private void MessageReceived(byte [] bytes)
        {
            if (EvtMessageReceived != null)
            {
                EvtMessageReceived(bytes);
            }
        }
}
procedurely 2013-07-18
  • 打赏
  • 举报
回复
思路就是:利用多线程循环侦听某个端口以防止界面阻塞,当接收到消息之后根据消息的指令来做相应处理

public class SocketListener
{
    public event DltMessage EvtMessageReceived;// 接收到消息后事件
    private Thread work = null;
    private Socket socket = null;
    private int port = 11111;
        /// <summary>
        /// 开始监听
        /// </summary>
        public void StartListen()
        {
            work = new Thread(new ThreadStart(Start));
            work.IsBackground = true;
            work.Start();
        }
        public void Start()
        {
           try
            {
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
                using (receiveClient = new UdpClient(remoteEP))
                {
                    while (true)
                    {
                        try
                        {
                            //接收
                            byte[] bytes = receiveClient.Receive(ref remoteEP);
                            MessageReceived(bytes);
                            Thread.Sleep(100);
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine("接收udp消息错误,原因:" + e.Message);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 接收完消息后触发
        /// </summary>
        private void MessageReceived(byte [] bytes)
        {
            if (EvtMessageReceived != null)
            {
                EvtMessageReceived(bytes);
            }
        }
}
接收到消息后通过委托拿到结果,再进行处理,这里你需要定义消息的格式,比如包头+包体:0001|123456 0001为包头,123456为包体

public static void main()
{
    SocketListener sl = new SocketListener();
    sl.EvtMessageReceived += new DltMessage(MessageTransfer);
}
public void MessageTransfer(byte[] bytes)
{
    string msg = Encoding.Default.GetString(bytes);//这里需要注意编码格式,双方编码格式要一致
    string[] message = msg.Split('|');
    if(message[0].Equals("0001"))
     {
        //点击开始按钮...只要拿到了消息就可以为所欲为了
     }
}
本拉灯 2013-07-18
  • 打赏
  • 举报
回复
引用 1 楼 ye568974617 的回复:
大多时候我看到这种问题都不想回答
一看到这种内容,就捡分走人。
请叫我卷福 2013-07-18
  • 打赏
  • 举报
回复
superlxw 2013-07-18
  • 打赏
  • 举报
回复
引用 4 楼 procedurely 的回复:
思路就是:利用多线程循环侦听某个端口以防止界面阻塞,当接收到消息之后根据消息的指令来做相应处理

public class SocketListener
{
    public event DltMessage EvtMessageReceived;// 接收到消息后事件
    private Thread work = null;
    private Socket socket = null;
    private int port = 11111;
        /// <summary>
        /// 开始监听
        /// </summary>
        public void StartListen()
        {
            work = new Thread(new ThreadStart(Start));
            work.IsBackground = true;
            work.Start();
        }
        public void Start()
        {
           try
            {
                IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, port);
                using (receiveClient = new UdpClient(remoteEP))
                {
                    while (true)
                    {
                        try
                        {
                            //接收
                            byte[] bytes = receiveClient.Receive(ref remoteEP);
                            MessageReceived(bytes);
                            Thread.Sleep(100);
                        }
                        catch(Exception e)
                        {
                            Console.WriteLine("接收udp消息错误,原因:" + e.Message);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 接收完消息后触发
        /// </summary>
        private void MessageReceived(byte [] bytes)
        {
            if (EvtMessageReceived != null)
            {
                EvtMessageReceived(bytes);
            }
        }
}
接收到消息后通过委托拿到结果,再进行处理,这里你需要定义消息的格式,比如包头+包体:0001|123456 0001为包头,123456为包体

public static void main()
{
    SocketListener sl = new SocketListener();
    sl.EvtMessageReceived += new DltMessage(MessageTransfer);
}
public void MessageTransfer(byte[] bytes)
{
    string msg = Encoding.Default.GetString(bytes);//这里需要注意编码格式,双方编码格式要一致
    string[] message = msg.Split('|');
    if(message[0].Equals("0001"))
     {
        //点击开始按钮...只要拿到了消息就可以为所欲为了
     }
}
请问DltMessage是什么啊,一个新创建的类?是不是要用delegate
superlxw 2013-07-17
  • 打赏
  • 举报
回复
引用 1 楼 ye568974617 的回复:
大多时候我看到这种问题都不想回答
额原谅我是个小白,我也找个很多资料,多线程的话好像是用委托,但是不知道怎么写函数,我在采集程序里加了一段监听的代码,如果接受到某条指令,就会触发按钮点击函数,这个具体该怎么实现啊
宸瑞-疾风 2013-07-17
  • 打赏
  • 举报
回复
大多时候我看到这种问题都不想回答

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧