Toon posts:

[C++] Chatten met CORBA

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

Momenteel ben ik bezig m een chat applicatie te schrijven in CORBA structuur. Dit doe ik op een Linux bak mbv C++.

Nu zit ik met het volgende probleem:
- op een client moet de gebruiker (een bericht voor een andere client) kunnen typen
- tijdens het typen moet de client blijven controleren of er geen berichten voor hem op de server zijn binnengekomen
- als er tijdens het checken berichten voor de client blijken te zijn, moeten deze worden opgehaald en op het scherm worden weergegeven.

Op welke manier kan ik er voor zorgen dat er een bericht voor de client op hetzelfde moment wordt weergegeven (op het moment dat het bericht vanaf een andere client wordt verstuurd) als wanneer de gebruiker aan het typen is?

Greetz
Tigi

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoi, welkom op GoT :)
Lees ook even de verplichte kost, namelijk De P&W FAQ en De "quickstart"
Daarin staan algemene richtlijnen over het posten in P&W. De Algemene GoT FAQ is natuurlijk ook belangrijk

Welnu, wat heb je al geprobeerd? Hoe zit je CORBA implementatie op het moment in elkaar? Ik neem aan dat als je een bericht stuurt, dat dan aan de client-kant een een of andere methode wordt aangeroepen om het bericht af te handelen. Je kunt 'm op dat moment toch gewoon weergeven?

Zonder wat meer info kunnen we je dus niet echt helpen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
Je uitleg doet vermoeden dat je een of ander polling mechanisme gebruikt. Dat is waarschijnlijk ontzettend onhandig, want zoals .oisyn aangeeft is het verwerken van asynchrone invocations veel makkelijker. Voorwaarde is dan wel dat je POA een multithreading policy gebruikt; de default is single-threaded en niet alle ORB's ondersteuning multithreading.

Om gedetailleerdere hulp te kunnen verlenen is het belangrijk om te weten welke interfaces je gedefineerd hebt, en welke objecten je in welke POA's hebt draaien. Die interfaces zouden redelijk simpel moeten zijn; misschien kun je zelfs overwegen gebruik te maken van de notification service, om een mooi gestandaardiseerde manier van event processing te krijgen.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Waarom zou een single-threaded CORBA ORB een bezwaar zijn? De applicatie kan toch alle CORBA calls in een enkele thread houden?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Zie hier de interface en een deel van client.cpp. Omdat ik alles aan het experimenteren ben, kunnen momenteel alleen de ingelogde gebruikers miep en piet met elkaar chatten.

Chat.idl:
code:
1
2
3
4
5
6
7
8
interface Chat
{
  typedef string list[5][2];
  void login(in string user);
  list getList();
  string getMessage(in string user);
  void say(in string to, in string what);
};


deel van de client.cpp:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  CORBA_Object_var obj = orb->string_to_object(s);
  
  Chat_var chat = Chat::_narrow(obj);
  cout << "Voer gebruikersnaam in: ";
  cin >> user;
  chat->login(user);

  cout << "Geef het commando /exit om af te sluiten." << endl;
    char mes[80];
    char c;
    int i;
  
  do
  {
    msg = chat->getMessage(user);
    if(strcmp(msg,"")!=0) cout << msg << endl;
    if (strcmp("piet",user)==0) chat->say("miep", mes);
    if (strcmp("miep",user)==0) chat->say("piet", mes);
    cout << "> ";
    cin >> mes;
   } while (strcmp(mes,"/exit")!=0);
  return 0;


In client.cpp wordt de functie say() aangeroepen om een gebruiker een bericht te sturen. Als een client een bericht stuurt, wordt dit in de list array opgeslagen. index[i][0]=gebruikersnaam, index[i][1]=bericht. De client roept na elke invoer de functie getMessage() aan, met als parameter de naam van de gebruiker. Vervolgens kijkt de server of er in de list array een bericht voor de gebruiker aanwezig is. Is dit het geval, dan wordt de inhoud hiervan teruggegeven en worden gebruiker plus bijhorend bericht uit de array verwijderd.

Is het zo een beetje duidelijk hoe mijn programma in elkaar zit?

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op 19 februari 2004 @ 21:18:

Chat.idl:
code:
1
2
3
4
5
6
7
8
interface Chat
{
  typedef string list[5][2];
  void login(in string user);
  list getList();
  string getMessage(in string user);
  void say(in string to, in string what);
};


deel van de client.cpp:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  CORBA_Object_var obj = orb->string_to_object(s);
  
  Chat_var chat = Chat::_narrow(obj);
  cout << "Voer gebruikersnaam in: ";
  cin >> user;
  chat->login(user);

  cout << "Geef het commando /exit om af te sluiten." << endl;
    char mes[80];
    char c;
    int i;
  
  do
  {
    msg = chat->getMessage(user);
    if(strcmp(msg,"")!=0) cout << msg << endl;
    if (strcmp("piet",user)==0) chat->say("miep", mes);
    if (strcmp("miep",user)==0) chat->say("piet", mes);
    cout << "> ";
    cin >> mes;
   } while (strcmp(mes,"/exit")!=0);
  return 0;
Je kunt hier het beste (in my opinion) gebruik maken van een functie zoals poll() onder linux of select(). Hiermee kun je namelijk een timeout instellen en alleen de cin in de gaten houden.

Geeft die getMessage een call naar de chatserver die daarop dan reageert of stuurt de chatserver een bericht en wordt dit uitgelezen met de getMessage? Als dit laatste namelijk het geval is kun je daarvoor ook gebruik maken van de poll of select functies. Misschien is het handig om de functie ook te geven als het mogelijk is. Want het lijkt me dat zo beide (server en client) erg inefficient worden als het telkens moet worden opgevraagd van de server (Qua dataverkeer).

Verwijderd

Topicstarter
De functie getMessage() geeft inderdaad een call naar de chatserver die daarop reageert (geeft een lege string terug indien geen bericht aanwezig, geeft bericht terug indien er een bericht is voor de client). zie onderstaande functie.

deel van Chat_impl.cpp:
code:
1
2
3
4
5
6
7
8
9
10
11
12
char* Chat_impl::getMessage(const char* user) {
  char* _msg;
  for (int i =0; i<5; i++)
  if (strcmp(t[i][0],user)==0) 
  {
    _msg = CORBA_string_dup(t[i][1]);
    t[i][0] = CORBA_string_dup("");
    t[i][1] = CORBA_string_dup("");
    return CORBA_string_dup(_msg);
  }
  return CORBA_string_dup("");
}


Helaas weet ik niet hoe de een bericht vanuit de server te laten sturen, zonder dat de client er telkens om moet vragen (zoals in bovenstaande getMessage()).

Maar goed, dan ga ik even uitzoeken hoe die functies poll() en select() werken. :)

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Als ik zo kijk dan moet de variabele "t" die jij gebruikt hier al opgevuld zijn. Dit zou betekenen dat de data dus al aanwezig is op het moment dat jij de getMessage aanroept. Misschien dat dit het gedeelte is wat op de server wordt gebruikt? Verder ging het me eerlijk gezegd om waar de data wordt ontvangen of opgehaald, dus in welke functie dit is en of deze functie in een aparte thread (lijkt me zo als ik naar deze code kijk) wordt uitgevoerd.

Als de functie in een aparte thread wordt uitgevoerd zou dat ook betekenen dat de data eerst door de chatserver wordt verstuurd en deze bij de thread worden uitgelezen en zodra de mainthread om de data vraagt wordt het weergegeven. Is dit het geval dan zou je moeten kijken hoe je de communicatie tussen de mainthread en de subthread voor elkaar kunt krijgen (via bv een fifo en dat ook laten controleren door de poll of de select-functie). Dat maakt het programma dan ook iets efficienter tenzij het geen probleem is dat het een tijdje duurt voordat het bericht wordt weergegeven.

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Welke ORB gebruik je? Voor dit soort `ongein' heeft CORBA nl. een heel mooi mechanisme: Event Channels. Hiermee kun je berichten (asynchroon) naar div. clients zenden, welke dan zelf uit kunnen zoeken wat ze er verder mee doen.

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.

Pagina: 1