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;
                }
            }
  • 相关阅读:
    HDU 5937 Equation
    HDU 5936 Difference
    hdu 4348 To the moon
    SPOJ QTREE Query on a tree
    HDU 3966 Aragorn's Story
    Codeforces 733F Drivers Dissatisfaction
    道良心题
    dp小总结
    数据结构
    数学相关(偏数学向题目的集中地)
  • 原文地址:https://www.cnblogs.com/TeemoHQ/p/6020094.html
Copyright © 2011-2022 走看看