remoting: initialiser un objet
Hello
bon apres mes déboires avec les services j'en ai d'autres avec le remoting...
voila mon souci, vais essayer d'etre clair:
j'ai une application qui reçoit via port com ou socket des données. elles stoque ces données dans une base de données
ce que j'aimerai: avoir une application "cliente" qui va "recuperer" les données que reçoit la premiere appli san spasser par la base de donnée
donc:
serveur (reçoit des données) --------------> stoque en BD
|
|
|
envoi les memes données au client
donc je voulais utiliser le remoting:
voici mon code:
mon interface:
Code:
1 2 3 4 5 6 7 8
|
namespace IRemote
{
public interface IRemote
{
string getDernier10Tickets();
}
} |
coté serveur: l'objet que j'aimerai partager:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| namespace AutocomScan3Listener
{
public class Remote : MarshalByRefObject, IRemote.IRemote
{
ArrayList arList= new ArrayList(10);
// Indique que l'objet aura une durée de vie illimitée
public override object InitializeLifetimeService()
{
return null;
}
public void ajouterTicketArrayList(string ticket)
{
arList.Add(ticket);
}
public string getDernier10Tickets()
{
string s = "";
foreach (string a in arList)
{
s += a + "\n";
}
return s;
}
} |
et le code qui initialise le remoting (toujorus coté serveur)
Code:
1 2 3 4 5 6 7
| Remote r = new Remote();
TcpServerChannel channel = new TcpServerChannel(9988);
ChannelServices.RegisterChannel(channel,true);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Remote),
"Remote", WellKnownObjectMode.Singleton); |
coté client:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| static void Main(string[] args)
{
try
{
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, true);
//RemotingConfiguration.RegisterWellKnownServiceType(typeof(IRemote.IRemote), "tcp://localhost:9988/Remote");
IRemote.IRemote Remote = (IRemote.IRemote)Activator.GetObject(typeof(IRemote.IRemote), "tcp://localhost:9988/Remote");
while (true)
{
Console.WriteLine(Remote.getDernier10Tickets());
Thread.Sleep(3000);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.Read();
} |
voila mon souci
mon objet Remote que j'ai appelé r doit etre utilisé par plusieurs threads par le serveur. uil contient donc une arraylist que j'aimerai remplir au fur est a mesure...
or quand j'interroge la methode de l'interface chez le client, je n'ai rien du tout dans l'arraylist!
ma question est donc la suivante: comment faire dire au remoting que je veux passer CET objet LA bien specifique, deja initialisé et utilisé par d'autres objets du serveur?
merci d'avance