Пример именованных труб
Как написать простой - минимальный минимум, необходимый для работы - тестовое приложение, которое иллюстрирует, как использовать 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