温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

关于WPF多窗口消息传递的简单实现

发布时间:2020-08-07 15:20:45 来源:网络 阅读:2056 作者:speciallst 栏目:编程语言

  在目前一些桌面端展示系统的应用中,需要多个子系统窗口进行信息交换,对于部署在同一台电脑上的各个子系统,可以通过集成windows系统的消息传递方式进行消息传递,但是假如将各个子系统部署在不同的电脑上,这种实现方式就有一定的局限性,要涉及到网络中的不同电脑进行通信,.net提供了可以建一个小的http服务器,可以绑定计算机的端口进行通信,且提供了异步的实现方式,能实现无阻塞的消息通信。

具体实现:
//启动一个监听, 并绑定端口,MSDN有详细参数说明
public bool StartListener(string[] prefixes)
        {
            bool isSuccess = false;
            if (HttpListener.IsSupported)
            {
                HttpListener listener = new HttpListener();
                foreach (string s in prefixes)
                {
                    listener.Prefixes.Add(s);
                }
                listener.Start();
                var result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
                isSuccess = true;
                //Console.WriteLine("Waiting for request to be processed asyncronously.");
                //result.AsyncWaitHandle.WaitOne();  
                //listener.Close(); 
            }
            return isSuccess;
        }

        public void StopListener()
        {
            if (listener != null)
            {
                if (listener.IsListening)
                {
                    listener.Stop();
                }
                listener.Close();
            }
        }
//异步接收数据,并进行下一次的
        private void ListenerCallback(IAsyncResult result)
        {
            HttpListener listener = (HttpListener)result.AsyncState;
            HttpListenerContext context = listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;
            HttpListenerResponse response = context.Response;
            response.ContentType = "text/plain";
            System.IO.Stream output = response.OutputStream;
            string responseString = "true";
            try
            {
                if (MessageAction != null)
                {
                    System.IO.Stream inputStream = request.InputStream;
                    string resStr = string.Empty;
                    if (inputStream.CanRead)
                    {
                        byte[] bytes = new byte[request.ContentLength74];
                        int numBytesToRead = (int)request.ContentLength74;
                        inputStream.Read(bytes, 0, numBytesToRead);
                        inputStream.Close();
                        resStr = Encoding.UTF8.GetString(bytes);
                    }
                    MessageAction(resStr);
                }
            }
            catch (Exception ex)
            {
                responseString = "false";
            }
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
            response.ContentLength74 = buffer.Length;
            output.Write(buffer, 0, buffer.Length);
            output.Close();
            result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
        }

将建立好的代码集成到应用程序里,使用.Net的webclient就可以进行消息的操作。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI