Kolejne zadanie składa się z dwóch części.
Pierwszą częścią zadania będzie modyfikacja programu EIS na wersję
klient-serwer. Dotychczasowy program należy podzielić na dwa programy:
klienta realizującego interfejs użytkownika, i serwer realizujący dostęp do
bazy danych. Programy powinny komunikować się przez gniazdka domeny Unix.
Klient ma umożliwiać użytkownikowi przeglądanie zawartości indeksu EIS.
Z założenia, klientów może być wielu, pracujących równolegle.
Serwer będzie osobno uruchamianym, nieinterakcyjnym programem obsługującym
bazę danych, i przystosowanym do odpowiadania na (prawie) jednoczesne
żądania od różnych klientów.
Proszę rozważyć dwie możliwości implementacji serwera, omówione na
wykładzie. Pierwsza to wersja wieloprocesowa, tzw. współbieżna, z
tworzeniem podprocesu dla obsługi każdego klienta. W tym przypadku
konieczne będzie stosowanie blokad na bazę danych, podobnie jak w wersji
monolitycznej programu EIS. Druga możliwość to wersja jednoprocesową,
tzw. iteracyjna. W tym przypadku serwer obsługuje wszystkich klientów w
jednym procesie, i wtedy obsługa pojedynczych żądań musi być albo bardzo
szybka, albo musi być podzielona na kawałki i serwer musi być w stanie
obsługiwać jednocześnie wielu klientów kawałek po kawałku. Ponieważ tylko
jeden proces ma dostęp do bazy danych, blokady są w tym przypadku
niepotrzebne.
Wskazówka: realizacja współbieżna jest typowo łatwiejsza. Realizacja
iteracyjna wymaga staranniejszego zaplanowania komunikacji klientów z
serwerem, ale jest to wersja ciekawsza.
Dla komunikacji między klientami a serwerem należy opracować mini-protokół
komunikacyjny określający jaka będzie treść i format żądań przesyłanych
serwerowi przez klientów, oraz jaka będzie treść, format, i reżim czasowy
odpowiedzi serwera, a także ich odczytania przez klientów.
Drugą częścią zadania jest zaimplementowanie klienta systemu EIS za pomocą
biblioteki curses omawianej na wykładzie. Celem jest czytelne i wygodne
zorganizowanie interakcji z użytkownikiem, zarówno w zakresie menu
operacji, jak i prezentacji wyników otrzymanych od serwera. Interfejs
powinien być skromny, proszę testować jego wygląd i zachowanie nie tylko na
różnych systemach, ale również na różnych emulatorach terminala. Mają one
różne możliwości, i niektóre nie będą wyświetlać wszystkich atrybutów,
których ustawianie umożliwia biblioteka curses. Na przykład, wszystkie
terminale obsługują podświetlanie (atrybut A_REVERSE), ale wiele
terminali nie obsługuje tekstu migającego, pogrubionego, pocienionego,
pochyłej czcionki, itp. (Tekst migający jest dodatkowo dość irytujący.)
Proszę zwrócić uwagę na przypadek wyboru większej partii danych (przez
wyrażenie regularne) i zaimplementować poprawną obsługę tego przypadku. Na
przykład, gdyby klient zażądał wyszukania jakichś danych (studentów lub
ocen) wyrażeniem, które zwróci ich bardzo dużo (> 1000), to program klienta
nie może wyświetlić ich wszystkich na ekranie. Nie może również zmuszać
użytkownika do oglądania ich wszystkich ekran po ekranie. Musi być
możliwość porzucenia nieobejrzanych wyników, i realizacji nowego żądania.