Можете ли вы читать и писать с помощью одного клиента Named Pipe? - PullRequest
5 голосов
/ 08 декабря 2011

Я написал небольшое приложение, которое создает именованный сервер и клиент, который подключается к нему.Вы можете отправлять данные на сервер, и сервер успешно их читает.

Следующее, что мне нужно сделать, - это получать сообщения с сервера, поэтому у меня есть еще один поток, который порождает, сидит и ждет входящих сообщений.данные.

Проблема в том, что пока поток находится в ожидании входящих данных, вы больше не можете отправлять сообщения на сервер, поскольку он зависает при вызове 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);
    }
}

1 Ответ

1 голос
/ 02 января 2018

Вы не можете читать из одного потока и записывать в другом потоке в тот же объект канала. Таким образом, хотя вы можете создать протокол, в котором положение прослушивания изменяется в зависимости от данных, которые вы отправляете, вы не можете делать оба одновременно. Для этого вам понадобится канал клиента и сервера с обеих сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...