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]
}
}
}
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;
}
Danke Rainbird
ich habe probiert
ich bekomme fehler meldung bei server
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)
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
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.
Dankeschön xxxprod und Rainbird
endlich habe ich laufendes Programm
Jetzt kann ich umbauen wie ich es will!! 🙂