jueves, 17 de enero de 2013

C# Ejemplo de comunicación entre procesos mediante PIPE


Vale como ejemplo crearemos dos aplicaciones a modo de que una será una servidor en el que podremos redactar mensajes que se enviaran a los clientes. Y la otra será la aplicación cliente que recibirá estos mensajes.

Empecemos creando la interfaz visual que tendrá la aplicación que hará de servidor. Y es mi caso tendrá un aspecto visual como este.



Ahora nos iremos al evento Click() de nuestro botón. Que será una cosa parecida a esto:

        private void btoEnviar_Click(object sender, EventArgs e)
        {

        }

Para empezar a utilizar PIPE lo primero que tendremos que hacer es agregar el espacio de nombre que contienen estos objetos para ello tendremos agregar el espacio de nombre “System.IO.Pipes”.
El objeto que vamos a utilizar para realizar el envió se llama “NamedPipeClientStream” el código de nuestro programa servidor quedaría así:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Pipes;

namespace ServidorPIPE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btoEnviar_Click(object sender, EventArgs e)
        {

                var ServidorEnvio = new NamedPipeClientStream("ServerPIPE");

                // Para conectar con el servidor PIPE
                // que va ser nuestro cliente que esta escuchando
                ServidorEnvio.Connect(60);

                // Creamos un buffer y le paso el valor de nuestro textbox
                byte[] buffer = ASCIIEncoding.ASCII.GetBytes(txtMensaje.Text);

                // Lo enviamos
                ServidorEnvio.Write(buffer, 0, buffer.Length);

                ServidorEnvio.Close();
        }
    }
}


Ahora realizaremos el que va ser nuestro cliente una captura de la interfaz.




Ahora el código para nuestro cliente que recibirá los mensajes:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Pipes;

namespace ClientePIPE
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                var ClientePIPE = new NamedPipeServerStream("ServerPIPE");

                // Bucle para esperar respuestas
                ClientePIPE.WaitForConnection();

                byte[] buffer = new byte[255];
                ClientePIPE.Read(buffer, 0, 255);

                // Se asigna el valor
                txtMensaje.Text = ASCIIEncoding.ASCII.GetString(buffer);

                // Refresca los datos
                Refresh();

                ClientePIPE.Close();
            }
        }
    }
}


Un video del ejemplo funcionando.


Un saludo.



1 comentario:

  1. bonjour,
    dommage de n'avoir pas traitre un exemple de de pipe nommé in/out avec un échange de données dans les deux sens. Si tu as un exemples n'hésite pas à me le faire savoir

    ResponderEliminar