首页 > 编程语言 >C#应用程序多窗口消息传递

C#应用程序多窗口消息传递

时间:2022-09-27 23:37:32浏览次数:49  
标签:string C# 多窗口 inputStream listener buffer HttpListener result 消息传递

       在目前一些桌面端.net系统的应用中,需要多个子系统窗口进行信息交换,对于部署在同一台电脑上的各个子系统,可以通过集成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​​​​; ​​


​​}​​


​​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;​​
​​ContentType 根据选择会自由返回,也可以是Json​​

​​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.ContentLength64];​​


​​int​​​ ​​numBytesToRead = (​​​​int​​​​)request.ContentLength64;​​


​​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.ContentLength64 = buffer.Length;​​


​​output.Write(buffer, 0, buffer.Length);​​


​​output.Close();​​


​​result = listener.BeginGetContext(​​​​new​​​ ​​AsyncCallback(ListenerCallback), listener);​​


​​}​​



​​ 因为使用的是异步监听,效率还是挺高的,延迟很短,能保证一个视觉上的系统执行。

标签:string,C#,多窗口,inputStream,listener,buffer,HttpListener,result,消息传递
From: https://blog.51cto.com/speciallist/5717770

相关文章

  • ServiceStack跨平台服务(分享)
       分享目前使用的最舒服的.net服务开发类库,开发简单,速度也相当快,而且还可以进行跨平台,集成多种数据库的访问。   以下官网的英文原文:   如需查找,请互联......
  • C#使用 OpenXML SDK读取Excel文档
        Excel的文档,本身就是一个压缩包,使用压缩工具打开一个excel文件,可以看到里边的文件列表如下图:    里边的文件主要就是一些xml文件和其他的素材    ......
  • C++语言程序设计基础 内联函数
    C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数......
  • C# implicit隐式转换
    今天看书,上面介绍implicit和explicit相对冷门,用的较少。这个implicit类型虽然冷门,但真的很有用。我在自己的项目里就用了这个上Demo,1publicpartialclassMainW......
  • docker命令自动补全
    1、安装bash-completionyuminstall-ybash-completion2、重新连接docker服务器使docker补全命令生效,或者建立新的远程连接docker服务器。输入dockerpu,再Tab键两......
  • docker 创建镜像images
    1.先下载基础镜像,并准备好你要部署的jar包 2.编写dockerfile 文件FROMascdc/jdk8:latestRUNmkdir-p/home/app/demo&&chmod777/home/app/demo&&cd/home......
  • English words chapter 20220927
    ......
  • 实验2:Open vSwitch虚拟交换机实践
    (一)基础要求执行ovs-vsctlshow命令、以及p0和p1连通性测试的执行结果截图开启MininetCLI并执行pingall命令的截图上述目录下查看OVS流表的命令结果截图wireshark......
  • copy2word
    ;Thisscriptcreatesanewdocumenttoholdstufffromtheclipboard.;Thisscriptcreatesanewdocumenttoholdstufffromtheclipboard.;Usage;-Hig......
  • tomcat
    tomcat目录一.简介二.部署tomcat一.简介Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍......