Пример именованных труб

Как написать простой - минимальный минимум, необходимый для работы - тестовое приложение, которое иллюстрирует, как использовать IPC/Именованные каналы?

Например, как можно написать консольное приложение, в котором программа 1 говорит "Hello World" для программы 2, а программа 2 получает сообщение и отвечает "Roger That" на программу 1.

Ответ 1

using System;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StartServer();
            Task.Delay(1000).Wait();


            //Client
            var client = new NamedPipeClientStream("PipesOfPiece");
            client.Connect();
            StreamReader reader = new StreamReader(client);
            StreamWriter writer = new StreamWriter(client);

            while (true)
            {
                string input = Console.ReadLine();
                if (String.IsNullOrEmpty(input)) break;
                writer.WriteLine(input);
                writer.Flush();
                Console.WriteLine(reader.ReadLine());
            }
        }

        static void StartServer()
        {
            Task.Factory.StartNew(() =>
            {
                var server = new NamedPipeServerStream("PipesOfPiece");
                server.WaitForConnection();
                StreamReader reader = new StreamReader(server);
                StreamWriter writer = new StreamWriter(server);
                while (true)
                {
                    var line = reader.ReadLine();
                    writer.WriteLine(String.Join("", line.Reverse()));
                    writer.Flush();
                }
            });
        }
    }
}

Ответ 2

Для тех, кто новичок в IPC и Named Pipes, я нашел следующий пакет NuGet, чтобы помочь вам.

GitHub: Именованный трубопровод для .NET 4.0

Чтобы использовать первую установку пакета:

PS> Install-Package NamedPipeWrapper

Затем пример сервера (скопированный из ссылки):

var server = new NamedPipeServer<SomeClass>("MyServerPipe");
server.ClientConnected += delegate(NamedPipeConnection<SomeClass> conn)
    {
        Console.WriteLine("Client {0} is now connected!", conn.Id);
        conn.PushMessage(new SomeClass { Text: "Welcome!" });
    };

server.ClientMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message)
    {
        Console.WriteLine("Client {0} says: {1}", conn.Id, message.Text);
    };

server.Start();

Пример клиента:

var client = new NamedPipeClient<SomeClass>("MyServerPipe");
client.ServerMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message)
    {
        Console.WriteLine("Server says: {0}", message.Text);
    };

client.Start();

Наилучшая вещь для меня в том, что в отличие от принятого ответа здесь он поддерживает несколько клиентов, разговаривающих с одним сервером.

Ответ 3

Фактически вы можете записать в именованный канал, используя его имя, btw.

Откройте командную оболочку как Администратор, чтобы обойти ошибку "Доступ запрещен" по умолчанию:

echo Hello > \\.\pipe\PipeName