Uruchamiając serwer podajemy adres i numer portu. Protokół chat'a oparty jest o nasza
własną klasę CProtocolUnit, nie jest w żadnym stopniu zgodny ze standardem IRC'a zawartym w RFC1459.
Opis protokołu:
<komenda> <spacja> <argument
krotki> <spacja> <argument długi>
Komendy:
ERROR serwer
wysyła do klienta, gdy podany nick jest już wykorzystywany lub gdy klient
próbuje 'mowić' przed
użyciem JOIN
<ERROR> <spacja> <numer błędu> <spacja> <komunikat>
SAY
klienci do serwera: klient użył JOIN, ma swój nick i chce rozmawiać
serwer do klientów: serwer odebrał tekst od jednego klienta i rozsyła do wszystkich z listy
<SAY> <spacja> <NICK> <spacja> <TEXT>
WHISPER klient do serwera: klient chce
przesłać tekst tylko do jednej
osoby z listy
serwer do klienta: serwer przesyła tekst do adresata
<WHISPER> <spacja> <ADRESAT> <spacja> <TEXT>
JOIN
klient do serwera: gdy uzyskał połączenie z serwerem i chce dołączyć
się do dyskusji
serwer do klientów: serwer powiadamia klientów, ze nowy klient dołączył do dyskusji
klient-serwer: <JOIN> <spacja> <NICK>
serwer-klient: <JOIN> <spacja> <NICK> <spacja> <TEXT>
NICK
klient do serwera: klient chce zmienić nick
serwer do klienta: zawiadamia, że nastąpiła zmiana nick'a klienta
klient-serwer: <NICK> <spacja> <NEW NICK>
serwer-klient: <NICK> <spacja> <OLD NICK> <spacja> <NEW NICK>
BYE
klient do serwera: nie służy do zakończenia sesji z serwerem, a jedynie do
wyj?cia z trybu SAY
serwer do klienta: powiadamia, że dany użytkownik wyłączył się z rozmowy
klient-serwer: <BYE> <spacja> <NICK>
serwer-klient: <BYE> <spacja> <NICK>
LIST klient-serwer: klient prosi o listę użytkowników połączonych z serwerem
serwer-klient: serwer wysyła listę użytkowników za każdym razem, gdy podłącza się nowa osoba,
rozłącza się, zmienia nick
klient-serwer: <LIST>
serwer-klient: <LIST> <spacja> <lista nickow w postaci CString>
WELCOME serwer-klient: serwer wysyła potwierdzenie, ze sesja rozpoczęta
<WELCOME>
DOWN
serwer-klient: w momencie zatrzymania serwera, tuż przed usunieciem gniazd, wysyłana
jest
wiadomoć do klientów, ze serwer zakończył prac?ć
<DOWN>
W klasie CProtocolUnit jest metoda Extract, dzieki której z CString uzyskujemy
komendę i argumenty.
Polecenia analizowane są przez funkcje:
ReceiveFromClent(CString&) (w aplikacji Chat Server)
ReceiveFromServer(CString&) (w aplikacji Chat Client)
Do obsługi połączeń i wymiany informacji między klientem i serwerem wykorzystywane
są klasy CClientSock i CServerSock. Schemat dziedziczenia:
-CObject
-CAsyncSocket
-CSocket
-CClientSock (CServerSock)
Po stronie serwera:
1. tworzymy gniazdo nasłuchujące:
wywoływana jest funkcja Create(numer_portu)
2. nasłuchiwanie:
wywoływana jest funkcja Listen()
3. akceptowanie nowego klienta
wywoływana jest funkcja OnAccept
tworzone jest gniazdo do porozumiewania się z tym wła?nie klientem
4. wymiana informacji
klient-serwer
poprzez OnReceive, wewnątrz tej funkcji wywoływana jest ReceiveFromClient
serwer-klient
poprzez SendString, wewnątrz SendString jest wywoływana funkcja Send
Po stronie klienta:
1. tworzymy gniazdo do komunikacji z serwerem:
wywoływana jest funkcja Create()
to gniazdo nie jest jeszcze z niczym połączone
2. aby połączyć gniazdo klienta z serwerem używamy:
Connect(adres_serwera, numer_portu)
3. wymiana informacji
serwer-klient
poprzez OnReceive, wewnątrz tej funkcji wywoływana jest ReceiveFromServer
klient-serwer
poprzez SendString, wewnątrz SendString jest wywoływana funkcja Send
W naszym programie argumentem przesyłanym miedzy klientem i serwerem był zawsze obiekt typu
CString, nie korzystalismy z klasy CArchive.
|