您可以使用单个Named Pipe客户端进行读写吗?

本文关键字:读写 客户端 Pipe 可以使 单个 Named | 更新日期: 2023-09-27 18:17:28

我编写了一个小应用程序,它创建了一个命名管道服务器和一个连接到它的客户端。您可以向服务器发送数据,并且服务器成功读取。

我需要做的下一件事是接收来自服务器的消息,所以我有另一个线程,它生成并等待传入的数据。

问题是,当线程等待传入数据时,您不能再向服务器发送消息,因为它挂在WriteLine调用上,因为我假设管道现在被捆绑检查数据。

所以这只是我没有正确地处理这个问题吗?还是命名管道不应该这样使用?我所看到的关于命名管道的例子似乎只有一个方向,客户机发送和服务器接收,尽管您可以将管道的方向指定为In, Out或两者。

任何帮助,指针或建议将不胜感激!

到目前为止的代码如下:

// Variable declarations
NamedPipeClientStream pipeClient;
StreamWriter swClient;
Thread messageReadThread;
bool listeningStopRequested = false;
// Client connect
public void Connect(string pipeName, string serverName = ".")
{
    if (pipeClient == null)
    {
        pipeClient = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut);
        pipeClient.Connect();
        swClient = new StreamWriter(pipeClient);
        swClient.AutoFlush = true;
    }
    StartServerThread();
}
// Client send message
public void SendMessage(string msg)
{
    if (swClient != null && pipeClient != null && pipeClient.IsConnected)
    {
        swClient.WriteLine(msg);
        BeginListening();
    }
}

// Client wait for incoming data
public void StartServerThread()
{
    listeningStopRequested = false;
    messageReadThread = new Thread(new ThreadStart(BeginListening));
    messageReadThread.IsBackground = true;
    messageReadThread.Start();
}
public void BeginListening()
{
    string currentAction = "waiting for incoming messages";
    try
    {
        using (StreamReader sr = new StreamReader(pipeClient))
        {
            while (!listeningStopRequested && pipeClient.IsConnected)
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    RaiseNewMessageEvent(line);
                    LogInfo("Message received: {0}", line);
                }
            }
        }
        LogInfo("Client disconnected");
        RaiseDisconnectedEvent("Manual disconnection");
    }
    // Catch the IOException that is raised if the pipe is
    // broken or disconnected.
    catch (IOException e)
    {
        string error = "Connection terminated unexpectedly: " + e.Message;
        LogError(currentAction, error);
        RaiseDisconnectedEvent(error);
    }
}

您可以使用单个Named Pipe客户端进行读写吗?

您不能从一个线程读取并在另一个线程上写入同一个管道对象。因此,虽然您可以创建一个协议,其中侦听位置根据您发送的数据变化,但您不能同时做这两件事。要做到这一点,您将需要两端的客户机和服务器管道。

关键是:

clientStream = new NamedPipeClientStream(".", clientPipeName, PipeDirection.InOut, PipeOptions.Asynchronous);
参数

PipeOptions。异步

指出读写流是异步的。