Laden...

Wie realisiert man Kommunikation über Pipes?

Erstellt von FrankenDerStein vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.782 Views
FrankenDerStein Themenstarter:in
72 Beiträge seit 2015
vor 4 Jahren
Wie realisiert man Kommunikation über Pipes?

Hallo liebe Kollegen,

Ich Schreibe an einer Anwendung die 2 Rollen einnimmt.

Die Erste Rolle wird ohne Prameter ausgeführt und arbeitet als Server.
Die Zweite Rolle wird über Parameter ausgeführt und arbeitet als Client.

Die Kommunikation soll über Pipes gesehen.
Laut den Informationen sollte das ja sehr einfach sein.

Aber, nö es funktioniert dem anscheid nicht so einfach.

Folgende Klasse habe zur Kommunikation geschrieben:

Davon gibt es ein Spiegelbild nur für den Client


 class InterCommunicationHandlerServer
    {
        NamedPipeServerStream serverStream;
        public event EventHandler<string> InputEvent;
        Thread observer;
        bool run;
        StreamReader reader;
        StreamWriter writer;
        bool shear;

        public InterCommunicationHandlerServer()
        {
            shear = false;
        }
        public void Start()
        {
            run = true;
            observer = new Thread(new ThreadStart(obseverTh));
            observer.Name = "InterCommunicationHandler";
            observer.Start();
        }

        private void obseverTh()
        {
            do
            {
                if (serverStream != null && serverStream.IsConnected)
                {

                    if (reader != null)
                    {
                        if (InputEvent != null)
                        {
                            string msg = reader.ReadLine();
                            InputEvent(this, msg);
                        }
                    }
                }
                else
                {
                    serverStream = new NamedPipeServerStream("ShareAndReceive", PipeDirection.InOut,200,PipeTransmissionMode.Byte,PipeOptions.Asynchronous);
                    serverStream.WaitForConnection();
                    writer = new StreamWriter(serverStream);
                    reader = new StreamReader(serverStream);
                }
            } while (run);
        }
        public void Stop()
        {
            run = false;
        }
        public void Send(String value)
        {
            if (serverStream.IsConnected)
            {
                writer.WriteLine(value);
                writer.Flush();
            }
        }
    }


Mein Problem ist, dass die Anwendung im Client Modus beim Flush hängen bleibt.

Ich verstehe dies Leider nicht.

Ich hoffe ihr könnt mir helfen.

Mit freundlichen Grüßen, FrankenDerStein.

16.806 Beiträge seit 2008
vor 4 Jahren

Wenn der Code Käse ist, dann können Pipes nichts dafür 😉

Die offizielle Microsoft Doku hat dafür eigentlich nen gutes Beispiel dafür
Vorgehensweise: Verwenden von Named Pipes zur prozessübergreifenden Kommunikation über ein Netzwerk

Von meiner Seite aber der Tipp: mit gRPC hast Du einen deutlich moderneren Ansatz, der viel mehr Zeug für Dich managed und quasi fast alle Anwendungszwecke von Named Pipes erfüllt - und vieles auch mehr bietet.

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo FrankenDerStein,

ich will Abts Antwort ergänzen / untermauern.

(Named) Pipes sind genauso wie TCP "low level" und i.d.R. ist es nicht nötig so tief (im Stack) selbst zu programmieren. Wesentlich effizienter und komfortabler ist es Frameworks zu verwenden, welche die low level Kommunikation wegabstrahieren. gRPC ist momentan das Maß der Dinge (aktuell auch zurecht).

Pipes, TCP, etc. würde ich nur dass verwenden wenn es nicht anders geht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

FrankenDerStein Themenstarter:in
72 Beiträge seit 2015
vor 4 Jahren

Danke für die Antwort.

Ich werde mich über diese Technologie informieren.

Kennt ihr noch weitere Alternative Technologien?

Mit freundlichen Grüßen, FrankenDerStein.

16.806 Beiträge seit 2008
vor 4 Jahren

Wie bereits gesagt wurde ist gRPC die aktuellste Art und Weise und Maß der Dinge.