World of Web

Chat Teil 2: Server-Applikation

by on Okt.01, 2010, under .NET Remoting

Chat Server mit .NET Remoting
Part2: Server Applikation

Vorwort

Dies ist der zweite Teil des Tutorials „Wie erstelle ich einen Chat mithilfe von .NET-Remoting“.

Implementierung des Interfaces IServer

Bevor wir an den Grund-Kern des Servers gehen können, müssen wir im ersten Schritt erstmal eine Klasse erstellen, die das Interface „IServer“ implementiert.

Es empfiehlt sich, die Einzelnen Komponenten einer „Solution“ in verschiedenen Projekt-Mappen zu halten.

Für den Server reicht eine einfache Konsolen-Anwendung, da nichtweiter Verwaltet werden muss. Die Einstellungen, z.B. Port und Adresse des Servers können einfach in eine Konfigurationsdatei gespeichert werden. In unserem Beispiel werden die Werte fest Übergeben.

Beispiel Implementierung des Interfaces:

public void Login(IClient client)
{
   Console.WriteLine("{0} logged on", client.Username);
   clientList.Add(client);
   foreach (IClient c in clientList)
   {
      c.AddUser(client);
   }
}
 
public void Logout(IClient client)
{
   foreach (IClient c in clientList)
   {
      if (!c.Equals(client))
      {
         c.RemoveUser(client);
      }
   }
   clientList.Remove(client);
   Console.WriteLine("{0} logged out", client.Username);
}
 
public void SendText(string text, IClient client)
{
   foreach (IClient c in clientList)
   {
      c.SetText(DateTime.Now.ToLongTimeString() + " <" + client.Username + ">: " + text);
   }
   Console.WriteLine("{0} wrote: {1}", client.Username, text);
}
 
public List; UserList()
{
   return clientList;
}

Bevor ich auf die einzelnen Funktionen eingehe, noch ein wichtiger Hinweis:

Die Klasse die das Interface Implementiert muss neben dem Interface auch von MarshalByRefObject abgeleitet werden, und zwar aus folgendem Grund:

Mit der Ableitung von MarshalByRefObject wird sichergestellt, dass für das Objekt der Zugriff über die Anwendungsdomänen hinweg aktiviert wird. Sollte die Klasse nicht davon abgeleitet werden, so wird eine Exception geworfen.

Jedes Objekt das von .NET-Remoting benutzt werden soll muss von diesem Objekt abgeleitet werden.

Nun zu den einzelnen Funktionen:

Die Login Methode

Die Login-Methode soll folgendes für uns erledigen:

  • Zum Test eine Nachricht auf der Serverkonsole ausgeben, dass sich Benutzer x angemeldet hat
  • Den neuen Benutzer in die Benutzerliste des Servers hinzufügen
  • Allen anderen Benutzern mitteilen, dass ein neuer Benutzer hinzugekommen ist.

Damit der Server die Login- und Logout-Methode richtig handhaben kann, wird dazu noch eine Liste der Benutzer benötigt.

Da diese, bis auf die UserList-Methode nicht benutzt wird, reicht es, diese als Private zu deklarieren:

private List clientList = new List();

in dieser Liste werden nun alle aktiven Benutzer gehalten.

Damit ist auch die Mitteilung an alle Benutzer recht einfach:

Man durchläuft einfach mit einer foreach-Schleife alle Inhalte dieser Liste.

Die Logout Methode

Die „Logout“-Methode ist von Prinzip her genau die selbe wie die Login-Methode, nur das eben der Benutzer nicht hinzugefügt wird, sondern gelöscht.

Die SendText Methode

Die „SendText“-Methode soll die Eingabe eines Benutzers an alle anderen Benutzer weiterreichen.

Der erste Schritt ist die Formatierung dieses Textes. Wenn ein Benutzer eine Eingabe vorgenommen hat, möchten die anderen Benutzer auch wissen, wann und von wem diese Eingabe getätigt wurde.

Die Formatierung in diesem Beispiel würde so aussehen:

HH:MM:SS <User>: Hallo

Es wird an die anderen Benutzer also nur noch der generierte String übergeben.

Die UserList Methode

Die „UserList“-Methode kommt nur bei Login des Benutzers zum Einsatz. Sie dient dazu dem Benutzer eine Liste der aktuellen aktiven Benutzer zu geben, um sie dann anschließend Visualisieren (in Form eines TreeViews) zu können.

Somit wäre die Implementierung des Interfaces „IServer“ abgeschlossen.

Kommen wir nun zum Grund-Kern der Server-Applikation:

Die Program.cs Datei

In der Program.cs Datei implementieren wir nun den „eigentlichen“ Server.

Hierbei muss beachtet werden:

Nachdem das Server-Objekt als Service registriert wurde, muss eine Endlos-Schleife generiert werden um das Schließen der Anwendung zu verhindern.

Codebeispiel der Server-Applikation:

Hashtable ServerProperties = new Hashtable();
ServerProperties.Add("port", 9050);
BinaryServerFormatterSinkProvider SinkProvider = new BinaryServerFormatterSinkProvider();
SinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
TcpChannel ServerChannel = new TcpChannel(ServerProperties, null, SinkProvider);
ChannelServices.RegisterChannel(ServerChannel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(cServer), "chat.rem", WellKnownObjectMode.Singleton);
bool stopFlagSet = false;
while (!stopFlagSet)
{
   if (Console.ReadLine() == "stop")
   {
      stopFlagSet = true;
   }
   else
   {
      continue;
   }
}

Zunächst einmal müssen wir die Server-Eigenschaften definieren. Die einzige Eigenschaft die bei der Beispiel Server-Applikation beachtet wird ist der Server-Port. Dieser wird hier auf den Port 9050 gelegt. Danach muss ein sogenannter „BinaryServerFormatterSinkProvider“ erstellt werden.

Die Zeile

SinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

Legt die Rechte für unseren SinkProvider fest. Zum Test werden die Rechte auf „Full“ gesetzt.

Danach wird ein TcpChannel Objekt für unseren Server instanziert, welchem die Server Eigenschaften und das SinkProvider Objekt übergeben werden.

Den ChannelServices wird anschließend mitgeteilt, das der oben erstelle TcpChannel von unserem Server registriert werden soll.

Anschließend wird er in der RemotingConfiguration als WellKnownServiceType Registriert. Für diesen WellKnownServiceType muss sichergestellt werden, das Server und Client über die gleichen Interfaces verfügen (Server und Client müssen also beide Zugriff auf das IServer, bzw. IClient interface haben).

Nachdem der Server registriert wurde, müssen wir in eine Endlosschleife laufen. Die Endlosschleife hat als Abbruchkriterium die Variable stopFlagSet. Wird auf der Serverkonsole „stop“ eingegeben und mit Enter bestätigt, so wird dieses Flag gesetzt und der Server fährt herunter.

An diesem Punkt sei erwähnt: Dieses Tutorial richtet sich nur an das oben erwähnte Szenario. Wer andere Projekte mit .NET Remoting vorhat, wird empfehlt, sich genauer mit den Eigenschaften zu befassen.

Weitere Vorgehensweise

Da der Server nun steht und auf eingehende Verbindungen wartet, müssen wir uns nun um die Client Erstellung kümmern.

Näheres dazu im nächsten Tutorial

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Post to Twitter Post to Plurk Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to MySpace Post to Ping.fm Post to Reddit Post to StumbleUpon

Share on Facebook




Leave a Reply