নামযুক্ত পাইপগুলির উদাহরণ


131

এটির কাজ করার জন্য আমি কীভাবে একটি সহজ - খালি ন্যূনতম প্রয়োজন লিখতে পারি - পরীক্ষার অ্যাপ্লিকেশন যা আইপিসি / নামযুক্ত পাইপগুলি কীভাবে ব্যবহার করবেন তা চিত্রিত করে?

উদাহরণস্বরূপ, কেউ কীভাবে কনসোল অ্যাপ্লিকেশন লিখতে পারে যেখানে প্রোগ্রাম 1 প্রোগ্রাম 2 কে "হ্যালো ওয়ার্ল্ড" বলে এবং প্রোগ্রাম 2 বার্তা পায় এবং প্রোগ্রাম 1 তে "রজার দ্যাট" জবাব দেয়।

উত্তর:


166
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();
                }
            });
        }
    }
}

1
@ জর্ডানট্রেণর দুঃখিত, এটি। নেট 4.5.৪ আছে। আপনি ব্যবহার করতে পারেনThread.Sleep
এলবি

2
@ গুড্ডর আমি কিছু সিঙ্ক-প্রিমাইটেভ ব্যবহার করতে পারতাম। তবে এটি পড়া আরও কঠিন হবে। আমি মনে করি নেমডপাইপস কীভাবে ব্যবহার করবেন সে সম্পর্কে ধারণা দেওয়ার পক্ষে যথেষ্ট
এলবি

2
আপনি সমস্যা যে নল প্রচেষ্টা এক পঠিত পরে, এই উত্তর চেক থাকে: stackoverflow.com/a/895656/941764
jgillich

11
আপনি .NET 4.5 ব্যবহার করেন, তাহলে আপনি পারেন প্রতিস্থাপন Task.Factory.StartNewসঙ্গেTask.Run
রুডি

2
আপনার কি নিষ্পত্তি করতে হবে reader/ writer? যদি তা হয় তবে আপনি কি কেবল তার মধ্যে একটির নিষ্পত্তি করবেন? দু'জন একই স্রোতের সাথে সংযুক্ত রয়েছে এমন উদাহরণ আমি কখনও দেখিনি।
জোশভার্টি

21

আইপিসি এবং নামযুক্ত পাইপগুলির ক্ষেত্রে নতুন কেউ, আমি নিম্নলিখিত নুগেট প্যাকেজটিকে একটি দুর্দান্ত সহায়তা বলে মনে করেছি।

গিটহাব: .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();

আমার পক্ষে এটি সম্পর্কে সর্বোত্তম জিনিসটি হ'ল এখানে গৃহীত উত্তরের মতো নয় এটি একক সার্ভারের সাথে কথা বলে একাধিক ক্লায়েন্টকে সমর্থন করে।


5
আমি উত্পাদনের জন্য এই নিউগেট প্যাকেজটির সুপারিশ করব না। আমি এটি বাস্তবায়ন করেছি এবং এটিতে কিছু বাগ রয়েছে, মূলত পাইপের অন্য প্রান্তে কোনও বার্তা যখন পুরোপুরি প্রাপ্ত হয়েছে তখন সত্যিই জানতে না পারার কারণে (ভাঙা সংযোগ বা সংযোগ খুব শীঘ্রই শেষ হবে) কোডটি দেখুন গিথুব আপনি যদি আমার উপর বিশ্বাস না করেন, "ওয়েটফোর্ডপাইপড্রেন" বলা উচিত নয়), এবং আপনার একাধিক ক্লায়েন্ট থাকবে যখন কেবল একজন শুনবে কারণ ... অনেকগুলি বিষয়)। এটি দুঃখজনক কারণ এটি ব্যবহার করা সত্যই সহজ ছিল। আমাকে কম বিকল্পগুলির সাথে স্ক্র্যাচ থেকে একটি পুনর্নির্মাণ করতে হয়েছিল।
মাইকেল ফ্যালিক্স

হ্যাঁ ভাল কথা, দুর্ভাগ্যক্রমে মূল রক্ষণাবেক্ষণকারীরা বছরের পর বছর ধরে প্রকল্পটি আপডেট করেননি, ভাগ্যক্রমে বেশ কয়েকটি কাঁটাচামচ বিদ্যমান রয়েছে যার মধ্যে বেশিরভাগই আপনি আলোচিত সমস্যাগুলির সমাধান করে।
মার্টিন লাক্কানেন

2
@ মার্টিনলাক্কানেন: হ্যালো, আমি নেমডপাইপরেপার ব্যবহার করার পরিকল্পনা করলাম, আপনি কি জানেন কোন কাঁটাচামচ এই বাগটি ঠিক করছে? ধন্যবাদ
18

17

আপনি আসলে নামকরণ করা পাইপে এর নাম, বিটিডাব্লু ব্যবহার করে লিখতে পারেন।

ডিফল্ট "অ্যাক্সেস অস্বীকৃত" ত্রুটিটি পেতে প্রশাসক হিসাবে একটি কমান্ড শেল খুলুন:

echo Hello > \\.\pipe\PipeName

3

লিনাক্সের এফওয়াইআই ডটনেট কোর নামক পাইপগুলি সমর্থন করে না, আপনি যদি লিনাক্সে থাকেন তবে পরিবর্তে tcplistener ব্যবহার করে দেখুন

এই কোডটিতে ক্লায়েন্টের রাউন্ড ট্রিপ একটি বাইট রয়েছে।

  • ক্লায়েন্ট বাইট লিখেছেন
  • সার্ভার বাইট পড়ে
  • সার্ভার বাইট লিখেছেন
  • ক্লায়েন্ট বাইট পড়ে

ডটনেট কোর 2.0 সার্ভার কনসোল অ্যাপ্লিকেশন

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

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeServerStream("A", PipeDirection.InOut);
            server.WaitForConnection();

            for (int i =0; i < 10000; i++)
            {
                var b = new byte[1];
                server.Read(b, 0, 1); 
                Console.WriteLine("Read Byte:" + b[0]);
                server.Write(b, 0, 1);
            }
        }
    }
}

ডটনেট কোর 2.0 ক্লায়েন্ট কনসোল অ্যাপ্লিকেশন

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

namespace Client
{
    class Program
    {
        public static int threadcounter = 1;
        public static NamedPipeClientStream client;

        static void Main(string[] args)
        {
            client = new NamedPipeClientStream(".", "A", PipeDirection.InOut, PipeOptions.Asynchronous);
            client.Connect();

            var t1 = new System.Threading.Thread(StartSend);
            var t2 = new System.Threading.Thread(StartSend);

            t1.Start();
            t2.Start(); 
        }

        public static void StartSend()
        {
            int thisThread = threadcounter;
            threadcounter++;

            StartReadingAsync(client);

            for (int i = 0; i < 10000; i++)
            {
                var buf = new byte[1];
                buf[0] = (byte)i;
                client.WriteAsync(buf, 0, 1);

                Console.WriteLine($@"Thread{thisThread} Wrote: {buf[0]}");
            }
        }

        public static async Task StartReadingAsync(NamedPipeClientStream pipe)
        {
            var bufferLength = 1; 
            byte[] pBuffer = new byte[bufferLength];

            await pipe.ReadAsync(pBuffer, 0, bufferLength).ContinueWith(async c =>
            {
                Console.WriteLine($@"read data {pBuffer[0]}");
                await StartReadingAsync(pipe); // read the next data <-- 
            });
        }
    }
}

নামকরণের পাইপগুলি কেবল 2 টি প্রক্রিয়াজাতকরণের জন্য আমাকে রেন্ডার করেSystem Unauthorized Accesss Exception - path is denied
বেরকোভিসি অ্যাড্রিয়ান

নিশ্চিত না অ্যাডমিন হিসাবে চালানো?
প্যাট্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.