autor: Jakub Madej
Projekt nr 11: Środowisko do kooperatywnej edycji tekstów.
- Działanie programu.
Środowisko składa się z programów klienta oraz serwera. Serwer uruchamia się podając mu jako parametry:
- plik programu do edycji
- nr portu na którym serwer ma nasłuchiwac na połączenia
- hasło, po podaniu którego klient będzie mógł rozpocząć pracę z plikiem
Klienta uruchamia się podając jako parametry:
- host, na którym jest uruchomiony program serwera (127.0.0.1 w przypadku, gdy serwer jest uruchomiony na tej samej maszynie co klient)
- nr portu, na którym ma nastąpić próba połączenia z serwerem
- hasło
Po uruchomieniu klient jest w stanie wyboru nowego fragmentu do edycji. W górnym oknie znajduje się podgląd tekstu jaki aktualnie znajduje się na serwerze. Na czerwono zaznaczone są fragmenty, które zostały wybrane przez jakichś użytkowników do edycji. Na niebiesko zostanie zaznaczony fragment, który wybierzemy do edycji my sami. Wyboru fragmentu dokonuje się w dolnym oknie poprzez zaznaczenie fragmentu a następnie wybranie z menu "edycja" opcji "akceptuj". Żądanie zostanie przesłane na serwer i zaakceptowane lub nie, o czym powiadomi odpowieni komunikat na belce statusowej na samym dole okna głównego. Serwer odmówi akceptacji w przypadku gdy inny użytkownik wybrał już do edycji fragment, który częsciowo pokrywa się z fragmentem zgłaszanym.
Po pomyślnym zaakceptowaniu w dolnym oknie pojawi się wybrany fragemnt i wtedy można przystąpić do jego edycji. Dostępne są standardowe skróty klawiaturowe, czyli ctrl-x, ctrl-c oraz ctrl-v jak również ctrl-z. Po zakończeniu edycji można przesłać fragment na serwer wybierając z menu "edycja" opcję "wyślij". W celu przerwania edycji i wyboru innego fragmentu należy wybrać "nowa edycja".
- Budowa i zasada działania serwera.
Program serwera jest napisany w C. Zasadniczo składa się on z nieskończonej pętli, w której za pośrednictwem funkcji select dokonywane jest śledzenie deskryptorów gniazd i odpowiednie reagowanie na różne rodzaje komunikatów, które są przez nie przesyłane. Każdemu klientowi odpowiada w programie struktóra, w której zapisany jest dekryptor gniazda związany z danym klientem, informacja, czy klient wybrał już fragment do edycji i o ile ten warunek jest spełniony - początek i koniec fragmentu przypisany danemu klientowi.
- Budowa i zasada działania klienta.
Program klienta napisany jest w C++ i składa sie z trzech klas, oraz funkcji main, której rola ogranicza się do stworzenia obiektów odpowiednich klas. Klasa Watek jest to klasa która obsługuje połączenie z serwerem - odbiera pakiety przychodzące z serwera oraz wysyła pakiety. Najważniejszą częścią klasy jest konstruktor, w którym podjęta zostaje próba nawiązania połączenia, oraz metoda run, która jest nieskończoną pętlą odbierającą dane przychodzące z serwera. Metoda ta zostaje uruchomiona przez konstruktor w nowym wątku. Jest to niezbędne, aby niezależnie użytkownik mógł prowadzić interakcję z programem.
W przypadku odebrania nowej wiadomości z serwera zostaje podjęta odpowiednia akcja. Zawsze wiąże się to z przesłaniem odpowieniego komunikatu do klasy GUI. Aby umożliwić poprawne działanie programu na serwerach X'ów nie mających wsparcia dla wielowątkowości (obsługujących swój protokół w sposób wyłącznie synchroniczny) konieczne jest wykonywanie metod klas qt tylko z jednego wątku. W tym celu utworzony wątek wysyła sygnał do wątku głównego i ten podejmuje odpowiednią akcję.
Klasa GUI jest klasą reprezentującą graficzny interfejs użytkownika zbudowany z wykorzystaniem komponentów biblioteki qt w wersji 2.
Klasa MojEdytor jest specjalizacją edytora dostępnego w qt. Jest ona stworzona jedynie w celu możliwości skorzystania z jednej metody, która jest zadeklarowana jako protected.
- Postać pakietów wysyłanych przez serwer.
Każdy pakiet wysyłany przez serwer lub klienta składa się z czterobajtowego nagłówka oznaczającego typ pakietu oraz opcjonalnej części właściwej. Kolejność bajtów we wszystkich przesyłanych liczbach odpowiada Little Endian. Typy pakietów są następujące (zgdnie z deklaracjami w serwer.c):
- OK (wartość 0) - brak części właściwej oznacza akceptację hasła przez serwer, w pozostałych przypadkach częścią właściwą jest tekst znajdujący się na serwerze w następującej postaci:
- 8 bajtów zawiera liczbę unsigned long będącą ilością znaków do przesłania (n)
- n bajtów znaków
- 4 bajty - int zawierający ilość fragmentów w edycji (m)
- m*16 bajtów będących parami liczb unsigned long oznaczających granice edytowanych fragmentów
- ZLE_HASLO (1) - wysyłane do klienta jeśli podane hasło jest nieprawidłowe
- SERWER_PELNY (2) - wysyłane do klienta jeśli serwer jest pełny
- BLAD (3) - wysyłane do klienta w momencie zgłoszenia do edycji fragmentu będącego już częściowo w edycji
- UAKTUALNIENIE (6) - jeśli w wyniku zmian edycyjnych ulegną zmianie granice edycji klientów, to serwer powiadomi ich o tym wysyłając ten pakiet; po nagłówku następuje 8 bajtów liczby long będących liczbą, którą należy interpretować jako przesunięcie fragmentu, po niej następuje tekst tak jak w pakiecie OK
- Pakiety wysyłane przez klienta.
- WYSYLANIE (5) - pakiet zawierający tekst przesyłany na serwer, po nagłówku następuje:
- 8 bajtów unsigned long będący długością tesktu (n)
- n bajtów tekstu
- pakiet inicjujący połączenie - składa się wyłącznie z hasła zakończonego znakiem '\0'