Именованные каналы (NamedPipe) в C#

844
10 мая 2017, 06:26

Код клиента:

 class PipeClient
    {
        static void Main()
        {
            string strIn,IN="",strA,strB;
            string[] str;
            int A, B, N;
            int[] arr;
            NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", "Marchosias", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);
            pipeClient.Connect();
            StreamWriter sw = new StreamWriter(pipeClient);
            StreamReader sr = new StreamReader(pipeClient);
            sw.AutoFlush = true; 
            while ((strIn = sr.ReadLine()) != null)
             {  
                IN += strIn + ",";
             }
            Console.WriteLine("Received from server: {0}", IN);
            str = strIn.Split('\n');
            str = str.Where(t => t != "").ToArray();
            strA = str[0];
            strB = str[1];
            Console.WriteLine("------[n]");
            Console.WriteLine(str.Count());
            N = str.Count() - 2;
            arr = new int[N];
            A = Convert.ToInt32(str[0]);
            B = Convert.ToInt32(str[1]);
            for (int i = 2; i < str.Length; i++)
                arr[i-2] = Convert.ToInt32(str[i]);
            Console.WriteLine("------N");
            Console.WriteLine(N);
            Console.WriteLine("------A");
            Console.WriteLine(A);
            Console.WriteLine("------B");
            Console.WriteLine(B);
            Console.WriteLine("------[i]");
            for (int j = 0; j < arr.Length; j++)
            {
                Console.Write(arr[j]);
                if (arr[j] > A && arr[j] < B)
                {
                    Console.WriteLine("+");
                }
                else
                    Console.WriteLine("-");
            }
            Console.ReadKey();
        }
    }
}

Код сервера:

class PipeServer
    {
        static int n = 5;
        static int a = 1;
        static int b = 4;
        static int[] X = {0,1,2,3,4};
        static StreamWriter sw;
        static StreamReader sr;
        static void Main()
        {
            Process proc = new Process();
            proc.StartInfo.FileName = @"C:\NamedPipes_p\bin\Debug\NamedPipes_p.exe";
            proc.Start();
            Thread thr = new Thread(new ThreadStart(ServerThread));
            thr.Start();
            Console.ReadLine();
        }
        private static void ServerThread()
        {
            try
            {
                NamedPipeServerStream pipeServer = new NamedPipeServerStream("Marchosias", PipeDirection.InOut, 1, PipeTransmissionMode.Message);
                sw = new StreamWriter(pipeServer);
                sr = new StreamReader(pipeServer);
                Console.WriteLine("Waiting For Connection");
                pipeServer.WaitForConnection();
                Console.WriteLine("Client connected.");
                sw.AutoFlush = true; 
                sw.WriteLine(a.ToString());
                sw.WriteLine(b.ToString());
                for (int t = 0; t < X.Length; t++)
                {
                    sw.WriteLine(X[t].ToString());
                }
                pipeServer.Disconnect();
                Console.WriteLine("Client disconnected.");
            }
            catch (IOException e)
            {
                Console.WriteLine("ERROR: {0}", e.Message);
                Console.ReadKey();
            }
        }
}

Вопрос: Как вернуть значение на сервер? И как его прочесть?

Answer 1

Переделал код под BinaryReader/BinaryWriter - все работает как часы. Почему не работало со Stream'ом - ума не приложу.

Может кому-то пригодится:

Код сервера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Pipes;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Threading;
using System.Security.Principal;
namespace NamedPipes
{
    class PipeServer
    {
        static int n;// = 5;
        static int a;// = 1;
        static int b;// = 4;
        static int[] X;// = {0,1,2,3,4};
        static NamedPipeServerStream pipeServer;
        static void Main()
        {
            Input();
            Process proc = new Process();
            proc.StartInfo.FileName = @"C:\NamedPipes_p\bin\Debug\NamedPipes_p.exe";
            proc.Start();
            Thread.Sleep(1000);
            Thread thr = new Thread(new ThreadStart(ServerThread));
            thr.Start();
            Console.ReadLine();
        }
        private static void Input()
        {
            Console.WriteLine("Input n: ");
           n = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Input array: ");
            X = new int[n];
            for (int i = 0; i < n; i++)
            {
                Console.Write("[{0}] = ", i);
                X[i] = Convert.ToInt32(Console.ReadLine());
            }
            Console.WriteLine("Input a: ");
            a = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Input b: ");
            b = Convert.ToInt32(Console.ReadLine());
        }
        private static void ServerThread()
        {
            try
            {
                using (pipeServer = new NamedPipeServerStream("Marchosias", PipeDirection.InOut))
                using (BinaryWriter bw = new BinaryWriter(pipeServer))
                using (BinaryReader br = new BinaryReader(pipeServer))
                {
                    Console.Write("Waiting For Connection........");
                    pipeServer.WaitForConnection();
                    if (pipeServer.IsConnected == true)
                    {
                        Console.WriteLine("Connected.");
                        bw.Write(n+2);
                        bw.Write(a);
                        bw.Write(b);
                        for (int t = 0; t < X.Length; t++)
                        {
                            bw.Write(X[t]);
                        }
                    }
                    pipeServer.WaitForPipeDrain();
                    Thread.Sleep(4000);
                    Console.WriteLine("Result: {0} ", br.ReadString());
                    pipeServer.Disconnect();
                }
            }
            catch (IOException e)
            {
                Console.WriteLine("ERROR: {0}", e.Message);
                Console.ReadKey();
            }
        }
    }
}

Код клиента:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading;
namespace NamedPipes_p
{
    class PipeClient
    {
        static void Main()
        {
            string OUT = "";
            int A, B;
            int N;
            int[] arr;
            using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "Marchosias", PipeDirection.InOut))
            using (BinaryWriter bw = new BinaryWriter(pipeClient))
            using (BinaryReader br = new BinaryReader(pipeClient))
            {
                Console.Write("Attempting to connect to pipe......");
                pipeClient.Connect();
                Console.WriteLine("Connected.");
                Console.WriteLine("There are currently {0} pipe server instances open.", pipeClient.NumberOfServerInstances);
                Console.Write("Receiving data.......");
                N = br.ReadInt32();
                A = br.ReadInt32();
                B = br.ReadInt32();
                Console.WriteLine("Done.");
                Console.WriteLine("n={0} a={1} b={2}",N,A,B);
                arr = new int[N-2];
                for (int f = 0; f < N-2; f++)
                {
                    arr[f] = br.ReadInt32();
                    Console.WriteLine("Arr[{0}] = {1}", f,arr[f]);
                }
                Thread.Sleep(4000);
                for (int j = 0; j < arr.Length; j++)
                {
                    if (arr[j] > A && arr[j] < B)
                    {
                        OUT += arr[j].ToString() + " ";
                    }
                }
                bw.Write(OUT);
                Environment.Exit(0);
            }
        }
    }
}
READ ALSO
C# - Посылка GET или POST запроса в UWP приложениях

C# - Посылка GET или POST запроса в UWP приложениях

Всем привет! Возник такой вопросКак сделать GET или POST запрос на сервер с uwp программы написанной на C#? И получить ответ? Ответ получаю в JSON

421
Вывести список приложений

Вывести список приложений

ПриветствуюПишу небольшую утилиту для windows

430
C# парсинг строки и конвертация в double

C# парсинг строки и конвертация в double

Строка была получена таким образом:

353
Создание Add-in для Office в Visual Studio

Создание Add-in для Office в Visual Studio

Поставил пакет разработки расширений для офиса, но в списке шаблонов не могу найти Access, хотя все остальные шаблоны офисных проектов присутствуют(Word,...

234