0

我有两个可执行文件:client.exeserver.exe

它们通过使用命名管道相互通信。当服务器仅侦听客户端请求并向客户端发送响应时,它们可以正常工作。

但现在的要求是 exe 都包含客户端管道和服务器管道。所以每个 exe 都包含两个方法:serverpipe()clientpipe(). 这些方法在一个线程中并且不相互通信。

第一个客户端和服务器正常通信。

客户端.EXE:

public static void Main(string[] Args)
{
    PipeClient obj=new PipeClient();
    obj.client();
    Thread startserver = new Thread(new ThreadStart(obj.server));
    startserver.Start();
}

public void client()
{
    int cnt =0;
    while (true)
    {
       System.IO.Pipes.NamedPipeClientStream pipeClient = new System.IO.Pipes.NamedPipeClientStream(".", "\\\\.\\pipe\\SamplePipe1", System.IO.Pipes.PipeDirection.InOut, System.IO.Pipes.PipeOptions.None);

        if (pipeClient.IsConnected != true) { pipeClient.Connect(); }

        StreamReader sr = new StreamReader(pipeClient);
        StreamWriter sw = new StreamWriter(pipeClient);

        string temp;
        temp = sr.ReadLine();

        if (temp == "Waiting")
        {
            try
            {
                cnt++;
                sw.WriteLine("clientSide Message " + cnt);
                sw.Flush();
                Thread.Sleep(10000);

            }
            catch (Exception ex) { throw ex; }
        }
        else
        {

        }
        pipeClient.Close();
    } 

}

public void server()
{
    StreamWriter sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile0.txt", true);

    System.IO.Pipes.NamedPipeServerStream pipeServer = new System.IO.Pipes.NamedPipeServerStream("\\\\.\\pipe\\SamplePipeSend1", System.IO.Pipes.PipeDirection.InOut, 4);

    sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile2.txt", true);

    sw1.Close();

    StreamReader sr = new StreamReader(pipeServer);
    StreamWriter sw = new StreamWriter(pipeServer);

    do
    {
        try
        {
            pipeServer.WaitForConnection();
            string test;
            sw.WriteLine("Waiting");
            sw.Flush();
            pipeServer.WaitForPipeDrain();
            test = sr.ReadLine();
            sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile2.txt",true);
            sw1.WriteLine(test);
            sw1.Close();
        }

        catch (Exception ex)
        { throw ex; }

        finally
        {
            pipeServer.WaitForPipeDrain();
            if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
        }
    } while (true);
}

服务器.EXE:

public static void Main()
{
    PipeServer obj = new PipeServer();
    obj.server();
    Thread startserver = new Thread(new ThreadStart(obj.client));
    startserver.Start();
}

public void server()
{
    System.IO.Pipes.NamedPipeServerStream pipeServer = new System.IO.Pipes.NamedPipeServerStream("\\\\.\\pipe\\SamplePipe1", System.IO.Pipes.PipeDirection.InOut, 4);

    StreamReader sr = new StreamReader(pipeServer);
    StreamWriter sw = new StreamWriter(pipeServer);

    do
    {
        try
        {
            pipeServer.WaitForConnection();
            string test;
            sw.WriteLine("Waiting");
            sw.Flush();
            pipeServer.WaitForPipeDrain();
            test = sr.ReadLine();
            Console.WriteLine(test);
        }

        catch (Exception ex)
        { throw ex; }

        finally
        {
            pipeServer.WaitForPipeDrain();
            if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
        }
    } while (true);
}

public void client()
{
    int cnt = 0;
    while (true)
    {
        System.IO.Pipes.NamedPipeClientStream pipeClient = new System.IO.Pipes.NamedPipeClientStream(".", "\\\\.\\pipe\\SamplePipeSend1", System.IO.Pipes.PipeDirection.InOut, System.IO.Pipes.PipeOptions.None);

        if (pipeClient.IsConnected != true) { pipeClient.Connect(); }

        StreamReader sr = new StreamReader(pipeClient);
        StreamWriter sw = new StreamWriter(pipeClient);

        string temp;
        temp = sr.ReadLine();

        if (temp == "Waiting")
        {
            try
            {
                cnt++;
                sw.WriteLine("clientSide Message " + cnt);
                sw.Flush();
                Thread.Sleep(10000);

            }
            catch (Exception ex) { throw ex; }
        }
        else
        {
            pipeClient.Close();
        }
    }
}
4

2 回答 2

5

请参阅内联注释:

public static void Main ( string[] Args )
{
    PipeClient obj = new PipeClient ();
    obj.client (); // <-- This has an endless loop and won't return
    // So the following lines  will never be executed!
    Thread startserver = new Thread ( new ThreadStart ( obj.server ) ); 
    startserver.Start ();
}

在进入无限循环之前启动线程:

public static void Main ( string[] Args )
{
    PipeClient obj = new PipeClient ();
    Thread startserver = new Thread ( new ThreadStart ( obj.server ) );
    startserver.Start (); 
    obj.client (); // Thread already running, so it's ok if this is endless
}

当然,这需要在服务器以及客户端执行中完成-

于 2012-08-21T07:12:33.377 回答
0

这听起来像是权限问题。

要创建全局可访问的命名管道,应用程序需要SeCreateGlobalPrivilege权限。

如果 Windows7 已打开 UAC,并且客户端未在提升模式下运行,则尝试创建全局命名管道将(静默)失败。


一些阅读:

创建命名管道 (WCF) 所需的最低操作系统权限

http://weblogs.thinktecture.com/cweyer/2007/12/dealing-with-os-privilege-issues-in-wcf-named-pipes-scenarios.html

示例集中在 WCF 上,但在这种情况下,WCF 只是命名管道通信之上的一层,问题的根源是相同的。

于 2012-08-21T06:07:25.500 回答