Serwer do przekazywania wiadomości
msgserver.cs
using System;
using System.Collections;
using System.Reflection;
namespace SimpleServer
{
// Kompilacja: csc /t:library msgserver.cs
public class MessageManager : MarshalByRefObject
msgclient.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Collections;
using System.Reflection;
using SimpleServer; // Przestrzeń nazw serwera
// Kompilacja: csc /r:msgserver.dll msgclient.cs
msghost.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using SimpleServer; // Przestrzeń nazw serwera
// Kompilacja: csc /r:msgserver.dll msghost.cs
namespace SimpleHost
{
Terminologia w projekcie:
Serwer - zestaw z deklaracją i implementacja zdalnych klas
Host - zestaw zawierający kod do rejestracji typów i kanałów.
Jeżeli funkcje hosta i serwera sa połaczone taki zestaw nazywa się serwerem lub serwerem-hostem. Niektórzy autorzy odwracają znaczenie hosta i i serwera. W poprzednich projektach uzywano terminologii odwróconej: serwer i obiekt klasy obiektu zdalnego.
Aplikcja rozważana umożliwia użytkownikom przesyłanie wiadomości do innych użytkowników i ich pobieranie. Pracuje w trybie konsolowym
Host
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using SimpleServer; // Przestrzeń nazw serwera
namespace SimpleHost
{
public class MessageHost
{
static void Main(string[] args)
{
Console.WriteLine("Host został uruchomiony.");
// Rejestruje kanał
HttpChannel c = new HttpChannel(3200);
ChannelServices.RegisterChannel(c);
// Rejestruje typ
Type ServerType = typeof(SimpleServer.MessageManager);
RemotingConfiguration.RegisterWellKnownServiceType(
ServerType, // Typ obiektu
"MojObiekt", // Dowolna nazwa
WellKnownObjectMode.Singleton);
// RemotingConfiguration.Configure("msghost.exe.config");
Console.Read();
}
}
}
Serwer
using System;
using System.Collections;
using System.Reflection;
namespace SimpleServer
{
public class MessageManager : MarshalByRefObject
{
ArrayList Messages = new ArrayList();
public MessageManager()
{
Console.WriteLine("wiadomość została utworzona.");
}
// Metoda łączy wszystkie wiadomości i zwraca klientowi zawierający je ciąg znaków
public string FetchMessages(string clientID)
{
string msgList= "";
Console.WriteLine(clientID);
for (int i = Messages.Count - 1; i >= 0; i--)
{
Envelope env = (Envelope)Messages[i];
if(env.RecipientID == clientID)
{
msgList += env.SenderID+": "+env.Message+"\n";
Messages.RemoveAt(i); // Usuwanie wiadomości
}
}
Console.WriteLine("Wysyłanie:\n {0}", msgList);
return(msgList);
}
// Metoda przyjmuje wiadomość od klienta i zapisuje ją w pamięci
public void SetMessage(string msg, string sender,
string recipient)
{
// Zapisuje wiadomość otrzymaną od klienta jako obiekt w tablicy
Envelope env = new Envelope();
env.Message = msg;
env.SenderID = sender;
env.RecipientID = recipient;
Messages.Add(env); // Dodaje wiadomość do tablicy
Console.WriteLine("Otrzymano:\n{0}", msg);
}
}
// Wiadomości są przechowywane w obiektach klasy Envelope
public class Envelope
{
public string Message;
public string SenderID;
public string RecipientID;
}
}
Klient
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Collections;
using System.Reflection;
using SimpleServer; // Przestrzeń nazw serwera
// Kompilacja: csc /r:msgserver.dll msgclient.cs
[assembly: AssemblyVersion("1.0.0.0"), System.CLSCompliant(true)]
namespace SimpleClient
{
public class MessageClient
{
static void Main(string[] args)
{
string myID;
// Identyfikator klienta przekazywany jest jako argument wiersza poleceń
if (args.Length > 0) myID = args[0]; else myID = "001";
Console.WriteLine("Klient został uruchomiony.");
// (1) Rejestruje kanał
HttpChannel c = new HttpChannel();
ChannelServices.RegisterChannel(c);
// (2) Rejestruje typ — obiekt aktywowany przez serwer przez port 3200
Type ServerType = typeof(SimpleServer.MessageManager);
string url = "http://localhost:3200/MojObiekt";
// Rejestruje typ w trybie aktywacji przez serwer
RemotingConfiguration.RegisterWellKnownClientType(
ServerType, url);
// (3) Tworzy instancję zdalnego obiektu
MessageManager mm = new MessageManager();
string msg;
string oper = "";
// Pozwala użytkownikom wysyłać i odbierać wiadomości
while (oper != "Z")
{
Console.WriteLine("(W)yślij, (O)dbierz, (Z)akończ");
oper = Console.ReadLine();
oper = oper.ToUpper();
if (oper == "W"){
Console.WriteLine("Wpisz identyfikator odbiorcy: wiadomość");
msg = Console.ReadLine();
// Dwukropek (:) oddziela identyfikator od wiadomości
int ndx = msg.IndexOf(":");
if (ndx > 0) {
string recipientID = msg.Substring(0, ndx).Trim();
msg = msg.Substring(ndx+1);
mm.SetMessage(msg, myID, recipientID);
}
} else
{
if (oper == "O") {
Console.WriteLine(mm.FetchMessages(myID));
}
}
} // while
} // metoda
} // class
} // namespace
Serwer do przekazywania wiadomości
Terminologia w projekcie:
Serwer - zestaw z deklaracją i implementacja zdalnych klas
Host - zestaw zawierający kod do rejestracji typów i kanałów.
Jeżeli funkcje hosta i serwera sa połaczone taki zestaw nazywa się serwerem lub serwerem-hostem. Niektórzy autorzy odwracają znaczenie hosta i serwera. W poprzednich projektach uzywano terminologii odwróconej: serwer i obiekt klasy obiektu zdalnego.
Aplikcja rozważana umożliwia użytkownikom przesyłanie wiadomości do innych użytkowników i ich pobieranie. Pracuje w trybie konsolowym
Serwer
Zawiera kod klasy MessageServer, która udostępnia klientom jako obiekt typu singleton aktywowany przez serwer. Oprócz wymaganego dziedziczenia po klasie MarshalByRefObject klasa ta jest nieodróżnialna od zwykłych klas, nieprzyznaczonych do zdalnego używania. Klasa MessageServer udostępnia dwie metody, SetMessage() i FetchMessage(), które służą do wysyłania i pobierania wiadomości. Wywołanie metody SetMessage() zawiera identyfikator nadawcy i odbiorcy oraz samą treść wiadomości. Wiadomości są pakowane do obiektu klasy Envelope i przechowywane w tablicy. Klienty pobierają wiadomość, wywołując metodę FetchMessage() z identyfikatorem klienta. Metoda ta przeszukuje tablicę wiadomości i zwraca ciąg znaków zawierający wszystkie wiadomości dla tego odbiorcy.
// Kompilacja: csc /t:library msgserver.cs
// msgserver.dll instalować na hosie i klientach
Host
Rejestruje kanały i typy. Kanał używa protokołu HTTP przez podany port, a obiekt MessageManager jest uruchomiany jako obiekt typy singleton. Po zakończeniu rejestracji zestaw monitoruje wskazany port, oczekując na wywołanie do obiektu MessageManager. Host przekazuje do tego obiektu wszystkie otrzymane wiadomości.
// Kompilacja: csc /r:msgserver.dll msghost.cs
Klient
Klient można uruchomić z parametrem opcjonalnym określającym identyfikator klienta (msgclient 005). Klient najpierw rejestruje typ i kanał. Po rejestracji tworzy obiekt klasy MessageManager za pomocą operatora new. Kiedy użytkownik wpisze O, obiekt pobierze wiadomosci. W celu przesłania wiadomości należy wpisać W jako pierwszą instrukcje oraz identyfikator odbiorcy i wiadomość jako kolejną.
// Kompilacja: csc /r:msgserver.dll msgclient.cs
msghost.exe
msgserver.dll
msgclient.exe
k
l
i
e
n
c
i
k
l
i
e
n
c
i
msgclient.exe
msgserver.dll
msghost.exe