2012-12-10 23 views
103

मैं इसे सरल बनाने के लिए एक साधारण - न्यूनतम आवश्यक कैसे लिखूं - परीक्षण अनुप्रयोग जो आईपीसी/नामित पाइप का उपयोग कैसे करता है?नामित पाइप्स का उदाहरण

उदाहरण के लिए, कैसे एक एक सांत्वना आवेदन लिखते थे जहां कार्यक्रम 1 "नमस्ते विश्व" कार्यक्रम 2 से कहता है और कार्यक्रम 2 संदेश और उत्तर "रोजर कि" कार्यक्रम के लिए 1.

उत्तर

130
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(); 
       } 
      }); 
     } 
    } 
} 
+0

बस सोच क्या पंक्ति: 16 System.Thread में माना जाता है 'देरी' के लिए कोई परिभाषा है क्योंकि टास्क –

+1

@ जोर्डन ट्रेनर क्षमा करें, यह नेट 4.5 में है। आप 'थ्रेड स्लीप' –

+0

का उपयोग कर सकते हैं इस उदाहरण में कार्य का उपयोग बहुत सख्त है। यह वर्बोज़ सिंटैक्स है और शेड्यूलिंग के कारण 1000ms के करीब भी नहीं हो सकता है। – Gusdor

17

किसी के लिए प्राप्त करता है जो आईपीसी और नामांकित पाइप्स के लिए नया है, मुझे निम्नलिखित NuGet पैकेज को बहुत मदद मिली है।

GitHub: Named Pipe Wrapper for .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(); 

मेरे लिए इसके बारे में सबसे अच्छी बात यह है कि यहां स्वीकृत उत्तर के विपरीत यह एक सर्वर से बात करने वाले कई ग्राहकों का समर्थन करता है।

+2

मैं उत्पादन के लिए इस NuGet पैकेज की सिफारिश नहीं करता। मैंने इसे कार्यान्वित किया है और इसमें कुछ कीड़े हैं, मुख्य रूप से यह जानने में सक्षम नहीं है कि जब पाइप के दूसरे छोर में एक संदेश पूरी तरह से प्राप्त हुआ है (टूटे हुए कनेक्शन की ओर जाता है, या कनेक्शन जल्द ही खत्म हो जाता है (कोड को जांचें github अगर आप मुझ पर भरोसा नहीं करते हैं, तो "WaitForPipeDrain" को यह नहीं कहा जाता है), इसके अलावा आपके पास कई क्लाइंट होंगे, भले ही केवल एक सुन रहा हो क्योंकि ... बहुत सारे मुद्दे)। यह दुखद है क्योंकि इसका उपयोग करना वास्तव में आसान था। मुझे कम विकल्पों के साथ स्क्रैच से एक को पुनर्निर्माण करना पड़ा। –

+0

हां अच्छा मुद्दा, दुर्भाग्यवश कि मूल रखरखाव ने वर्षों से परियोजना को अद्यतन नहीं किया है, सौभाग्य से हालांकि कई फोर्क मौजूद हैं जिनमें से अधिकांश मुद्दों पर आप चर्चा करते हैं। –

10

आप वास्तव में इसके नाम, बीटीडब्ल्यू का उपयोग कर नामित पाइप पर लिख सकते हैं।

प्रशासक डिफ़ॉल्ट से बचने के लिए के रूप में एक कमांड खोल खोलें "प्रवेश निषेध है" त्रुटि:

echo Hello > \\.\pipe\PipeName