Laden...

Remoting werte zurücklesen

Erstellt von mtc vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.627 Views
M
mtc Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren
Remoting werte zurücklesen

Hallo zusammen
Ich bin anfänger
Ich versuche gerade eine remoting mit entferntem server es soll drei double parameter übernehmen bearbeiten und neu berechnete drei double werte zurückgeben ich habe mit einfachen beispielen aus dem netz eine string zurückgeben können aber das reicht leider nicht meine methode soll drei double übernehmen und drei double zurückgeben wie gebe ich drei doubelwerte mit Marshel by Value zurück? Ich bitte um hilfe!
hier ist meine versuch code


//DLL
namespace RemoteInterface
{
    public interface IHello
    {
        
       
        string Botschaft(string name);
      

        double listem(double x,double altx,  double y);
    }
}
###############################################
//Server 
namespace HelloServer
{
    class Server
    {
       public static void Main()
        {
            Console.WriteLine("****Server gestartet*********+");
            Console.WriteLine("Return zum beenden");

            TcpServerChannel channel = new TcpServerChannel(4711);
            ChannelServices.RegisterChannel(channel);

           RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(Hello), //Objekt-Klasse
                "WKS-Name", //URI
                WellKnownObjectMode.Singleton); //jetzt als Singleton
                Console.ReadLine( ); //bis zum Abbruch
        }
}
public class Hello : MarshalByRefObject, IHello //Ableitung von MarshalByRefObjekt und IHello
{
public Hello( ) //Konstruktor
{
Console.WriteLine("Hello.Konstruktoraufruf");
}
~Hello( ) //Destruktor
{
Console.WriteLine("Hello.Destruktoraufruf");
}
public string Botschaft(string name) //Methode string
{
Console.WriteLine("Aufruf Botschaft von client");
return "Botschaft vom "+name;
}
  
    public double listem (double x,double altx, double y)
    {

                x =altx* y;
                altx = x* y ;
                 y = altx * x;
              
 [color] [SIZE]//hier will ich alle drei double werte zurückgeben x, altx,y???[/SIZE] [/COLOR]


    } 

}
}
###########################################
//Client
namespace HelloClient
{
    public class Client
    {   
        public static void Main()
        {
            double x = 5.75,altx = 2, y = 5.35;
            Console.WriteLine("****** Client gestartet ******");
            ChannelServices.RegisterChannel(new TcpClientChannel()); //Instanzierung und Registrierung
            IHello objHello = (IHello)Activator.GetObject( //Interface-Referenz !!!
            typeof(IHello), //Objekt-Klasse
            "tcp://localhost:4711/WKS-Name"); //URL
            if (objHello == null) //Proxy vorhanden?
            {
                Console.WriteLine("Server nicht gefunden!");
                return;
            }
               

             for (int i = 0; i < 5; i++)
                Console.WriteLine(objHello.Botschaft("Server")); //Methodenaufruf


           Console.WriteLine(objHello.listem(x, altx,y));

 [color] [SIZE]//hier will ich die neu berechnete drei Double werte zugreifen???[/SIZE] [/COLOR] 


          

         
        }
    }
}
3.728 Beiträge seit 2005
vor 16 Jahren
Mehrere Werte zurückgeben

Wenn Du mehrere Werte zurückgeben willst, benöigst Du eine serialisierbare Klasse als Container. Die könnte in Deinem Fall z.B. so aussehen:


[Serializable]
public class ListemResponse
{
    // Felder
    private double _x;
    private double _y;
    private double _oldX;

    #region Eigenschaften

    public double X
    {
        get {return _x;}
        set {_x=value;}
    }

    public double Y
    {
        get {return _y;}
        set {_y=value;}
    }

    public double OldX
    {
        get {return _oldX;}
        set {_oldX=value;}
    }

    #endregion
}

In Deiner Remoting-Funktion kannst Du dann eine Instanz davon erzeugen, diese mit den Ergebnissen befüllen und zurückgeben. Da die Klasse mit [Serializable] als serialisierbar gekennzeichnet ist, wird kein Verweis zum Client übertragen (wie bei MarshalByRef-Typen), sondern die Daten selbst.

So könnte die Klasse in der Funktion verwendet werden:


public ListemResponse listem (double x,double altx, double y)
{
    x =altx* y;
    altx = x* y ;
    y = altx * x;
               
    // Ergebnis-Container erzeugen
    ListemResponse response=new ListemResponse();

    // Ergebnisse eintragen
    response.X=x;
    response.Y=y;
    response.OldX=altx;

    // Ergebnis-Container zurückgeben
    return response;
}

M
mtc Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Danke Rainbird
ich habe probiert
ich bekomme fehler meldung bei server

  1. ( return response) 😉
    (Fehler Eine implizite Konvertierung vom Typ "RemoteInterface.ListemResponse" in "double" ist nicht möglich.)
  2. wie kann ich von client seite auf die werte zugreifen! wie shon gesagt ich bin anfänger des wegen will ich eine funktionierende beispiel sehen dann kann ich es umbauen wie ich es brauche
    danke im voraus
3.728 Beiträge seit 2005
vor 16 Jahren
Fehler

Sorry, war mein Fehler. Es muss natürlich heißen:


public ListemResponse listem (double x,double altx, double y)

und nicht


public double listem (double x,double altx, double y)

M
mtc Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Ja jetzt mekkert der nicht mehr
nun habe ich nur eine problem wie kann ich auf die zurückgegebene felder in client zugriefen ich poste mall die coding bis jetzt ob hier alles richtig gebaut ist


//Dll
using System;
using System.Collections.Generic;
using System.Text;

namespace RemoteInterface
{
    [Serializable]
    public  class ListemResponse
    {
        // Felder
        private double _x;
        private double _y;
        private double _oldX;

        #region Eigenschaften

        public double X
        {
            get { return _x; }
            set { _x = value; }
        }

        public double Y
        {
            get { return _y; }
            set { _y = value; }
        }

        public double OldX
        {
            get { return _oldX; }
            set { _oldX = value; }
        }
      
        #endregion
    } 
    public interface IHello
    {
         ListemResponse listem(double x,double altx,  double y);
      
    }
}

ist die classe hier richtig?


//Server
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteInterface;

namespace HelloServer
{
    class Server
    {
       public static void Main()
        {
            Console.WriteLine("****Server gestartet*********+");
            Console.WriteLine("Return zum beenden");

            TcpServerChannel channel = new TcpServerChannel(4711);
            ChannelServices.RegisterChannel(channel  );

           RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(Hello), //Objekt-Klasse
                "WKS-Name", //URI
                WellKnownObjectMode.Singleton); // als Singleton
                Console.ReadLine( ); //bis zum Abbruch
        }
}
public class Hello : MarshalByRefObject, IHello //Ableitung von MarshalByRefObjekt und IHello
  {
        public Hello( ) //Konstruktor
        {
        Console.WriteLine("Hello.Konstruktoraufruf");
        }
        ~Hello( ) //Destruktor
        {
        Console.WriteLine("Hello.Destruktoraufruf");
        }
        

       public ListemResponse listem(double x, double altx, double y)//Methode
            {
                x = altx * y;
                altx = x * y;
                y = altx * x;

                // Ergebnis-Container erzeugen
                ListemResponse response = new ListemResponse();

                // Ergebnisse eintragen
                response.X = x;
                response.Y = y;
                response.OldX = altx;
              
                // Ergebnis-Container zurückgeben
                return response ;
            } 
  

  }
}

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteInterface;
namespace HelloClient
{
    public class Client
    {
       /* struct mc
        {
            double x;
            double altx;
            double y;
        }*/
   
        public static void Main()
        {
            double x = 5.75,altx = 2, y = 5.35;
            Console.WriteLine("****** Client gestartet ******");
            ChannelServices.RegisterChannel(new TcpClientChannel()); //Instanzierung und Registrierung
            IHello objHello = (IHello)Activator.GetObject( //Interface-Referenz !!!
            typeof(IHello), //Objekt-Klasse
            "tcp://localhost:4711/WKS-Name"); //URL
            if (objHello == null) //Proxy vorhanden?
            {
                Console.WriteLine("Server nicht gefunden!");
                return;
            }
           objHello.listem(x, altx,y);//funktion aufruf mit parameter
           
          //##################################################################
           //wie kann ich hier auf die  Ergebnis-Container Felder zugreifen der von server zurückgegeben ist ???????
           //mit neu instanz auf der classe  ListemResponse geht nicht da bekomme ich immer 0 !!!!!
           
        }
    }
}

Hier muss ich auf die zurück gegebene felder zugreifen!
Danke im voraus

1.378 Beiträge seit 2006
vor 16 Jahren
objHello.listem(x, altx,y);//funktion aufruf mit parameter

Die Methode listem gibt dir das Objekt der Klasse ListemResponse zurück indem dann die Werte stehen.

Du rufst hier nur die Methode auf, speicherst aber nirgends das Objekt.
Mit...

ListemResponse response = objHello.listem(x, altx,y);

bekommst du das Objekt response und du greifst dann darauf zu.

M
mtc Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Dankeschön xxxprod und Rainbird
endlich habe ich laufendes Programm
Jetzt kann ich umbauen wie ich es will!! 🙂