NASZE SERWISY:    ANDROID   LINUX   MAEMO   SYMBIAN   WEBOS




Hosting sponsoruje:



GRIN3 - polskie fonty

Profesjonalne czcionki z polskimi znakami - czcionki.com

OpenMobile on Facebook


 

Klient - Serwer

Klient - Serwer

Postprzez lukasz18101988 » 3 maja 2010, o 11:01

Witam. Od czasu mojego ostatniego postu troszkę się poduczyłem :) ale jeszcze jednej rzeczy nie rozumiem.

Napisałem przykładową aplikację klient - serwer ( o nazwie Klient_Serwer_Kalkulator), bazując na przykładzie z książki. W miarę dobrze rozumiem co się tutaj dzieje.
Aplikacja ta jest prosta - klient podaje jakąś liczbę a serwer zwraca mu liczbę albo większą o 2 -metoda Dodaj() albo mniejszą o 2 - metoda Odejmij().

Nie wiem tylko gdzie uczynić punkt wejścia do programu "E32Main()" :
- czy tak jak jest domyślnie w pliku "Klient_Serwer_Kalkulator.cpp"
- czy też "KalkulatorSerwer.cpp", gdzie jest zdefiniowana klasa dziedzicząca z "CServer2"



Poniżej podaje zawartosc pliku "KalkulatorSerwer.cpp"

Kod: Zaznacz cały
#include <e32svr.h>

#include "KalkulatorSerwer.h"
#include "Wspolne.h"
#include "KalkulatorSesja.h"



CKalkulatorSerwer* CKalkulatorSerwer::NewL()
   {
   
   CKalkulatorSerwer* self = CKalkulatorSerwer::NewLC();
   CleanupStack::Pop( self );
   return self;
   
   }


CKalkulatorSerwer* CKalkulatorSerwer::NewLC()
   {
   
   CKalkulatorSerwer* self = new( ELeave ) CKalkulatorSerwer();
   CleanupStack::PushL( self );
   self->ConstructL();
   return self;
   
   }

void CKalkulatorSerwer::ConstructL()
   {
   
   StartL( KNazwaSerwera );
   
   }

CKalkulatorSerwer::CKalkulatorSerwer() : CServer2( EPriorityHigh )
         {
   
         }

CKalkulatorSerwer::~CKalkulatorSerwer()
   {
   
   }


CSession2* CKalkulatorSerwer::NewSessionL(  const TVersion& aVersion,
                                 const RMessage2& /*aMessage*/ ) const
                                 {
   
   // sprawdzamy wersje klienta
   if( !User::QueryVersionSupported( TVersion( 1,0,0 ),
                           aVersion   ) )
      {
   
   // klient wymaga nowszej wersji serwera
   User::Leave( KErrNotSupported );
   
      }
   
   return CKalkulatorSesja::NewL( *const_cast< CKalkulatorSerwer* >( this ) );
                                 
                                 
                                 }


void CKalkulatorSerwer::InkrementujLicznikSesji()
   {
   
   
   iLicznikSesji++;
   }

void CKalkulatorSerwer::DekrementujLicznikSesji()
   {
   iLicznikSesji--;
   if( iLicznikSesji == 0 )
      {
   CActiveScheduler::Stop();
      }
   
   }


TInt CKalkulatorSerwer::RunError( TInt aError )
   {
   
   
   // nie udalo sie utworzyc sesji - poinformuj o tym klienta
   Message().Complete( aError );
   
   // nie pozwalamy serwerowi zakończyc pracy
   ReStart();
   
   // obsłużylismy blad - mozemy zwrocic wartosc "KErrNone"
   return KErrNone;
   
   }

void CKalkulatorSerwer::SpanikujSerwer( TPanikaKalkulatorSerwera aNrPaniki )
   {
   
User::Panic( KKalkulatorSerwerPanika, aNrPaniki );
   
   }


void CKalkulatorSerwer::FunkcjaWatkuL()
   {
   
   // tworzymy i instalujemy instancje Zarzadcy Aktywnosci
   CActiveScheduler* activeScheduler = new( ELeave ) CActiveScheduler;
   CleanupStack::PushL( activeScheduler );
   CActiveScheduler::Install( activeScheduler );
   
   //tworzymy i startujemy serwer
   CKalkulatorSerwer::NewLC();
   
   // serwer zostal uruchomiony - teraz klient moze utworzyc sesje
   
   RSemaphore semafor;
   
   User::LeaveIfError( semafor.OpenGlobal( KNazwaSemafora ) );
   semafor.Signal();
   semafor.Close();
   
   // startujemy petle glowna Zarzadcy Aktywnosci
   CActiveScheduler::Start();
   
   // zwalniamy dwa ostatnie wskazniki znajdujace sie na szczycie stosu CleanupStack
   // (wskaznik na obiekt serwera oraz activeScheduler
   CleanupStack::PopAndDestroy( 2, activeScheduler );
   
   }


TInt CKalkulatorSerwer::FunkcjaWatku( TAny* /*aPtr*/  )
   {
   
   // tworzymy stos CleanupStack
   CTrapCleanup* cleanupStack = CTrapCleanup::New();
   if( !( cleanupStack ) )
      {
   SpanikujSerwer( EBrakStosuCleanupStack  );
      }
   
   // startujemy wlasciwa funkcje watku
   
   TRAPD( err, FunkcjaWatkuL()  );
   if( err != KErrNone )
      {
   SpanikujSerwer( EWyjscieWFunkcjiWatkuSerwera );
      }
   
   delete cleanupStack;
   return KErrNone;
   
   }


/*
// punkt wejscia do procesu
// Funkcja wywolywana przez system operacyjny

TInt E32Main()
   {
   
   return CKalkulatorSerwer::FunkcjaWatku( NULL );
   
   }


*/




-- 3 maja 2010, o 10:06 --

zapomniałem dodać że korzystam z metody HandleCommandL(TInt aCommand)

mam ją tak zdefiniowaną :
Kod: Zaznacz cały

...
...
...


case TestKlienta:
               {
               
               
               CKalkulatorSerwer::FunkcjaWatku( NULL );
               RKalkulator kalk;
               User::LeaveIfError( kalk.Polacz()  );
               CleanupClosePushL( kalk );
               
               TInt liczba=3;      // liczba podana ze strony klienta
               
               
               
               
               User::LeaveIfError( kalk.Dodaj( liczba ) );
               
               CleanupStack::PopAndDestroy( &kalk );
            
               
               
               }
               break;

...
...
...

lukasz18101988
1%
1%
 
Posty: 8
Dołączył(a): 2 marca 2010, o 18:54
    WindowsXPOpera

Re: Klient - Serwer

Postprzez mawhy » 3 maja 2010, o 18:50

lukasz18101988 napisał(a):Witam. Od czasu mojego ostatniego postu troszkę się poduczyłem :) ale jeszcze jednej rzeczy nie rozumiem.

Napisałem przykładową aplikację klient - serwer ( o nazwie Klient_Serwer_Kalkulator), bazując na przykładzie z książki. W miarę dobrze rozumiem co się tutaj dzieje.
Aplikacja ta jest prosta - klient podaje jakąś liczbę a serwer zwraca mu liczbę albo większą o 2 -metoda Dodaj() albo mniejszą o 2 - metoda Odejmij().

Nie wiem tylko gdzie uczynić punkt wejścia do programu "E32Main()" :
- czy tak jak jest domyślnie w pliku "Klient_Serwer_Kalkulator.cpp"
- czy też "KalkulatorSerwer.cpp", gdzie jest zdefiniowana klasa dziedzicząca z "CServer2"


Wg mnie i tak musisz skompilować oddzielnie Klient_Serwer_Kalkulator.cpp (który jest klientem) i jak KalkulatorSerwer.cpp (który jest serverem)
Funkcja E32Main() ma wywoływać wątek serwera. Myślę że problem jest taki że autor książki nie opisał jak uruchomić tego serwera po zainstalowaniu. Idealnie byłoby uruchamianie serwera razem z uruchamianiem komórki podczas startu. Albo napisać skrypt Pythona z taka linijką kodu e32.start_exe() który by uruchamiał serwer w razie potrzeby.

Pozdrawiam
Michał Małaj
mawhy
30%
30%
 
Posty: 104
Dołączył(a): 19 stycznia 2008, o 00:24
Lokalizacja: Lublin
    WindowsXPFirefox

Re: Klient - Serwer

Postprzez lukasz18101988 » 14 maja 2010, o 19:26

dzieki wielkie za wskazówki :) już działa :)
lukasz18101988
1%
1%
 
Posty: 8
Dołączył(a): 2 marca 2010, o 18:54
    WindowsXPOpera


Powrót do Symbian C++

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość