zoukankan      html  css  js  c++  java
  • 命名管道 问题:信号灯超时问题

    出错前服务端核心代码:

        private static NamedPipeServerStream _pipeServer = new NamedPipeServerStream("Pipe", PipeDirection.InOut, 1);
    
         private void WorkerThread()
            {
                try
                {
                    _pipeServer.WaitForConnection();
                    var ss = new StreamString(_pipeServer);
                    ss.WriteString("I am the one true server!");
                    var cmdText = ss.ReadString();
                    if (cmdText == "Are you Free?")
                    {
                        var result = _engine.IsHome(_engine.State);
                        ss.WriteString(result.ToString());
                    }
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    return;
                }
            }

    客户端核心代码:

      using (var pipeClient = new NamedPipeClientStream(".", "Pipe", PipeDirection.InOut,
                   PipeOptions.None, TokenImpersonationLevel.Impersonation))
                {
                        pipeClient.Connect(500);
    
                    if (pipeClient.IsConnected)
                    {
                        var ss = new StreamString(pipeClient);
                        if (ss.ReadString() == "I am the one true server!")
                        {
                            ss.WriteString("Are you Free?");
                            bool.TryParse(ss.ReadString(), out _isFree);
                         }
              }
            }

    通信逻辑:客户端一直去判断服务端是否空闲。

    可以看出来:客户端一直是起一个新的实例去通信服务端。服务端确实一个静态的唯一的实例

    出现问题。客户端只能去通信一次,再一次通信报错,出现信号灯超时问题。

    原因:服务端实例返回客户端信息后,通道关闭掉了。不再会等待连接。

    解决办法:1.服务端每次循环启动新的管道去监听。

         2.唯一实例的话。循环关闭连接再重新打开去监听。如下.

          

        public void Stop()
            {
                _running = false;
                _pipeServer.Disconnect();
            }
            private void WorkerThread()
            {
                try
                {
                    _pipeServer.WaitForConnection();
                    var ss = new StreamString(_pipeServer);
                    ss.WriteString("I am the one true server!");
                    var cmdText = ss.ReadString();
                    if (cmdText == "Are you Free?")
                    {
                        var result = _engine.IsHome(_engine.State);
                        ss.WriteString(result.ToString());
                    }
                    Stop();
                    WorkerThread();
                }
                catch (ThreadAbortException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    return;
                }
            }
  • 相关阅读:
    ubuntu英文环境下使用中文输入法
    Flex 调用添加了SoapHeader的web service
    RoR: Ruby On Rails Web Service 3 分发模式
    C# CRC8实现
    java正则表达式过滤html标签
    静态内部类和非静态内部类的区别
    Java反射机制
    java回调函数简介
    Java之泛型编程
    Java基础知识之系统命令调用、序列化、JDO、匿名内部类
  • 原文地址:https://www.cnblogs.com/TeemoHQ/p/6020094.html
Copyright © 2011-2022 走看看