2009-06-30 4 views
2

Ich benutze .Net Remoting und versuchen, auf ein Remote-Objekt im Server geändert zugreifen, hier ist das Objekt def: Die Idee ist, dass das MRB-Objekt, das ich auf dem Server erstellen , wird an den Client zurückgegeben und "Set On Server" wird ausgedruckt, wenn getString() auf dem Client aufgerufen wird.Problem mit .Net Remoting (C#)

Was ich jetzt bekomme, ist eine Null-Zeichenfolge auf dem Client, so dass das MRB-Objekt nicht an den Client gesendet wurde, wenn neu auf dem Client aufgerufen wurde. Entschuldigung für die verschiedenen Klassen usw., aber es ist die einzige Möglichkeit, ich habe so viel wie möglich getrimmt.

Was ich wirklich will, ist für "Set auf dem Server" gedruckt auf dem Client beim Ausführen.

using System; 
using System.Runtime.Remoting.Lifetime; 
namespace RemoteType 
{ 
    public class MyRemoteObject : System.MarshalByRefObject 
    { 
     private string sharedString; 
     public string getString() 
     { 
      return sharedString; 
     } 
     public void setString(string value) 
     { 
     sharedString = value; 
     } 
     public MyRemoteObject() 
     { 
      Console.WriteLine("MyRemoteObject Constructor Called"); 
     } 

     public override object InitializeLifetimeService() 
     { 
      return null; 
     } 
     public string Hello() 
     { 
      return "Hello, Welcome to .Net Remoting !"; 
     } 
    } 

hier wissen, ist der Server:

using System; 
using System.Runtime.Remoting; 
using RemoteType; 
namespace SimpleServer 
{ 
    class SimpleServer 
    { 
     public static MyRemoteObject MRB = null; 
     static void Main(string[] args) 
     { 
      RemotingConfiguration.Configure("RemotingAppServer.exe.config"); 
      MRB = new MyRemoteObject(); 
      MRB.setString("Set on the server"); 
      Console.WriteLine(MRB.getString()); 
      RemotingServices.Marshal((MRB), "MyRemoteObject"); 
      Console.WriteLine("Press return to exit"); 
      Console.ReadLine(); 
     } 
    } 

und .NET Remote-Config App.Config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.runtime.remoting> 
     <application> 
      <channels> 
       <channel ref="tcp" port="8000" /> 
      </channels> 
      <service> 
       <wellknown mode="Singleton" 
       type="RemoteType.MyRemoteObject, RemoteType" 
       objectUri="MyRemoteObject" /> 
      </service> 
     </application> 
    </system.runtime.remoting> 
</configuration> 

schließlich der Kunde:

using System; 
using System.Runtime.Remoting; 
using RemoteType; 
namespace SimpleClient 
{ 
    class SimpleClient 
    { 
     static void Main(string[] args) 
     { 
      RemotingConfiguration.Configure("RemoteClient.exe.config"); 
      MyRemoteObject robj = new MyRemoteObject(); 
      Console.WriteLine(robj.Hello() + " " + robj.getString()); 
      Console.ReadLine(); 
     } 
    } 
} 

Und sein Konfiguration auch:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.runtime.remoting> 
     <application name = "SimpleClient"> 
      <client> 
       <wellknown 
       type="RemoteType.MyRemoteObject,RemoteType" 
       url="tcp://localhost:8000/MyRemoteObject"/> 
      </client> 
      <channels> 
       <channel ref="tcp" port="0"/> 
      </channels> 
     </application> 
    </system.runtime.remoting> 
</configuration> 

Antwort

2

Ich habe Ihren Code getestet und funktionierte perfekt. Ich habe drei Projekte festgelegt, eines mit Server, eines mit Client und eines dritten zwischen Server und Client für das Remote-Objekt. In der remote app.config können Sie den bekannten Eintrag entfernen, da Sie ihn bereits per Code marshallen.

+0

Haben Sie auf dem Client "Set on the server" angezeigt, wenn der Client ausgeführt wird? – daniel

+0

@daniel: Haben Sie das Projekt so eingerichtet, dass Server und Client gleichzeitig gestartet werden? Wenn ja, könnte das Hinzufügen eines Thread.Sleep am Anfang des Client-Codes hilfreich sein. –

+0

Ja, ich sah "Auf dem Server setzen" in beiden Bildschirmen Client und Server. Ich hatte zwei Lösungen, eine für Server und eine für Client. Ich habe zuerst den Server gestartet und dann den Client viele Male gestartet, alle mit dem gleichen erfolgreichen Ergebnis. – jmservera

0

Sind Sie sicher, dass Ihre Sockets geschlossen werden, sobald die Anwendung beendet wird?

Wenn Sie mehrmals testen schnell diese tcp Kommunikationsprobleme

0

verursachen könnte eine Firewall TCP-Port 8000 in Ihrer Umgebung blockieren? Sie könnten versuchen, zu HTTP nur als Test zu wechseln.