TCPChannel schließen/freigeben und Remote-Klassen freigeben



  • Hallo,

    für ein Spiel im Spieler gegen Spieler-Modus nutze ich TCPChannels, um eine Verbindung der beiden Spiele herzustellen. Das Spiel an sich kann Server und Client sein. Doch leider bekomme ich den Wechsel von Server zu Client nicht hin, da ich die TCP-Channels nicht schließen kann und anscheinend die Remote-Objekte weiterhin registriert bleiben.

    Der Aufruf des Servers ist z.B.:
    multiplayer::channelServ = gcnew TcpChannel(9090);
    ChannelServices::RegisterChannel(multiplayer::channelServ,false);
    RemotingConfiguration::RegisterWellKnownServiceType(inServerForClient::typeid, "service2.rem", WellKnownObjectMode::SingleCall);
    multiplayer::remoteType = gcnew WellKnownClientTypeEntry(inClientForServer::typeid, "tcp://" + clientIP + ":9091/service.rem");
    RemotingConfiguration::RegisterWellKnownClientType(multiplayer::remoteType);

    Wie kann ich nun den TcpChannel wieder beenden und die registrierten Klassen, die zum remote-Zugriff freigegeben wurden, wieder zurückholen? Und wie kann ich dann wieder eine andere Klasse zum remote-Objekt machen?

    Viele Grüße



  • beschreibe doch dein problem noch ein wenig genauer, ich verstehe jedenfalls dein problem nicht...

    simon



  • Hallo,

    ja, meine Beschreibung war etwas ungenau. Also versuchen wir es noch mal:

    Zwei Instanzen eines Spiels, beide identisch, sollen per TcpChannel miteinander kommunizieren. Dazu fungiert ein Spiel als "Server" und einer als "Client".

    Dazu erstellt der Server zuerst einen Channel:
    multiplayer::channelServ = gcnew TcpChannel(9090);
    ChannelServices::RegisterChannel(multiplayer::channelServ,false);
    Dann wird für den Client eine Klasse zum remoten bereitgestellt:
    RemotingConfiguration::RegisterWellKnownServiceType(inServerForClient::typeid, "service2.rem", WellKnownObjectMode::SingleCall);

    Dann ist der Client dran. Er registriert ebenfalls einen Channel und stellt eine Klasse zum remoten bereit. Dann registriert er die Remote-Klasse des Servers:
    multiplayer::remoteType = gcnew WellKnownClientTypeEntry(inServerForClient::typeid, "tcp://" + serverIP + ":9090/service2.rem");
    RemotingConfiguration::RegisterWellKnownClientType(multiplayer::remoteType);

    Der Server registriert ebenfalls die Remote-Klasse, natürlich die vom Client.

    Die Kommunikation funktioniert. Zum Ende des Spiels soll, ohne die Instanz des Spiels zu schließen, die Verbindung beendet werden, damit diese ganzen Funktionen wieder neu aufrufbar sind.
    Ruft man den ganzen Code, den ich grade beschrieben habe, erneut auf, so bleibt er z.B. beim TcpChannel hängen, da wahrscheinlich ein TCP-Channel mit dem Port offen ist.
    Gute wäre es, wenn man den TcpChannel irgendwie schließen kann. Der Destruktor-Aufruf von TcpChannel hat auf jeden Fall nicht geholfen. Auch sollten die registrierten Klassen wieder zurückgesetzt werden bzw. überschreiben werden können.

    Hoffe, es ist jetzt etwas verständlicher, auch wenn der Text länger geworden ist. Vielen Dank!

    Viele Grüße



  • Ein Objekt wird bei dem Code oben gar nicht instanziert.
    Nur registriert...

    Ich sehe keinen Client Code der ein Remote Objekt benutzt.
    Nur Server (edit: und Client) Code der die Remote Objekte (die noch nicht existieren) zur Verfügung stellt.

    Simon



  • Hallo,

    Ein Objekt wird schon erstellt:
    multiplayer::channelServ = gcnew TcpChannel(9090);
    und danach registriert:
    ChannelServices::RegisterChannel(multiplayer::channelServ,false);

    wobei channelServ als Klassenvariable existiert und es zwar beim Destruktor-Aufruf keinen Fehler gibt, den TcpChannel aber anscheinend nicht schließt/entfernt.
    Auch ein
    ChannelServices::UnregisterChannel(multiplayer::channelServ);
    hilft nichts.

    Das war auch nicht der ganze Code, sollte nur teilweise das Verständnis fördern. Der Client ruft z.B. so die Klasse auf dem Server auf, nachdem sie mit
    multiplayer::remoteType = gcnew WellKnownClientTypeEntry(inServerForClient::typeid, "tcp://" + serverIP + ":9090/service2.rem");
    RemotingConfiguration::RegisterWellKnownClientType(multiplayer::remoteType);
    registriert wurde:
    inServerForClient^ myRemoteClass = gcnew inServerForClient;
    myRemoteClass->punkteUebertragen();

    Dabei wird die nicht bereits vorhandene und lokale inServerForClient benutzt, sondern die auf dem Server.



  • hallo,
    ich glaube er will einfach wissen, wie man eine vorhandene tcp verbindung über .net remoting schließt, so dass man in der selben instanz des programmes eine neue verindung aufbauen kann (halt ohne das prog zu schließen und wieder zu öffnen).

    grüße



  • Ich verstehe nicht wozu das Ab- bzw. Aufbauen der Verbindungen eine Rolle spielt, bzw. vom Programm gesteuert werden muss. Das über nicht doch die Remoting Infrastruktur.

    Die "Funktionen", wie Du sie nennst, sind ja an Objekte gebunden.
    Bei SingleCall Semantik, wird sowiso jedesmal ein neues Objekt auf der Remote Seite erstellt.

    Ev. hilfts es mehr mit Objekten, als mit Funktionen zu denken.
    Simon

    Edit:
    Der TcpServerChannel() besitzt die Methoden StartListen() und StopListen(). Ev. ist es das was du suchst.


Anmelden zum Antworten