Concurrency and The Reconcile Error Dialog
Transkrypt
Concurrency and The Reconcile Error Dialog
Przesyłanie Pakietów Danych i TCP/IP Dwa komponenty z zakładki Internet palety komponentów pomogą nam wysłać pakiety danych poprzez sieć TCP/IP. TServerSocket będzie umieszczony w aplikacji serwera a TClientSocket zostanie składową aplikacji klienta. Pierwsza rzecz, którą zrobimy to aplikacja serwera. 1. Wybierz File | New Application. Pojawi się pusta nowa aplikacja. 2. Wybierz File | New Application i nowy moduł danych zostanie dołączony do projektu. 3. Zapisz wszystkie pliki do wybranego katalogu pod nazwami names Unit1.pas (Form1), Unit2.pas (DataModule2) i TCP_IP_Server.dpr (TCP_IP_Server). 4. Upuść komponent TSession na DataModule2 i ustaw jego właściwość AutoSessionName na True. 5. Umieść TDatabase na DataModule2 i ustaw jego właściwości tak samo jak miało to miejsce w przykładowej aplikacji Hello World. 6. Upuść komponent TQuery na DataModule2 i skojarz go z Database1. Ustaw jego właściwość SQL na ‘SELECT * FROM department’. 7. Umieść Tprovider na DataModule2 i ustaw jego właściwość DataSet na Query1. 8. Upuść komponent TclientDataSet na DataModule2 i ustaw właściwość ProviderName na ‘Provider1’. 9. Upuść komponent TserverSocket na DataModule2 i ustaw jego właściwości na następujące: Port na 8888, ServerType na stThreadBlocking i właściwość Active na True. Zamierzamy stworzyć aplikację wielowątkową. Dlatego też ustawiliśmy właściwość AutoSessionName komponentu Session1 by zapewnić bezpieczną z punktu widzenia wątków komunikację z bazą danych. Ustawienia parametrów dla komponentu ServerSocket1 gwarantuje, że oddzielne wątki będą obsługiwały każde zgłoszenie klienta na port 8888. Teraz musimy dodać sekcje krytyczną do DataModule2 by zablokować inne wątki, gdy jeden z nich korzysta z komponentów dostępu do danych na DataModule2. W tym celu dodajemy do klauzuli uses w Unit2 deklarację SyncObjs. Dodajemy również zmienną FCSect do sekcji prywatnej TDataModule2 oraz zdarzenia OnCreate i OnDestroy do DataModule2 Teraz dodamy deklarację nowego wątku serwera do sekcji interface Unit2 i przeciążamy jedną z odziedziczonych metod ClientExecute procedure. Nowy wątek tego typu powinien być stworzony za każdym razem, gdy nowy klient połączy się aplikacją serwera. By to zrobić musimy dodać obsługę zdarzenia OnGetThread ServerSocket1. Możemy teraz napisać metodę ClientExecute klasy TmyServerThread. Aplikacja powinna wyglądać podobnie do poniższej: Następne dwie strony zawierają całą implemenację ClientExecute. Zawiera ona dużo kodu. Przeczytaj komentarze w kodzie, które powinny przybliżyć zasadę działania tej metody. Ten skomplikowany kod został napisany by zastąpić przypisanie właściwości Data komponentu prowidera na właściwość Data komponentu zbioru danych klienta, ale to jeszcze nie koniec. Wciąż potrzebujemy kodu aplikacji aplikacji żeby połączyć się z serwerem aplikacji oraz wysłać żądanie do serwera i odebrać pakiet danych z strumienia połączenia z serwerem. Zróbmy to teraz. 1. Wybierz File | New Application. Pojawi się nowa pusta aplikacja. 2. Wybierz File | New… | Data Module i do aplikacji zostanie dodany nowy moduł danych. 3. Zapisz wszystkie pliki do wybranego przez ciebie katalogu pod nazwami Unit1.pas (Form1), Unit2.pas (DataModule2) i Project1.dpr (Project1). 4. Upuść komponent TclientDataSet na DataModule2. 5. Umieść komponent TdataSource na DataModule2 i ustaw jego własność DataSet na ClientDataSet. 6. Upuść komponent TclientSocket na DataModule2. Ustaw jego własność Port na 8888. Teraz wykonamy interfejs użytkownika aplikacji klienta. Może on wyglądać podobnie do tego: Pole edycyjne ulokowane w dolnym lewym rogu formy przechowuje adres IP aplikacji serwera. Gdy użytkownik przyciśnie przycisk Load, metoda LoadDepartments DataModule2 zostanie wywołana. Zarówno aplikacje serwera jak i klienta są już gotowe. Uruchom TCP_IP_Server.exe, później Project1.exe i naciśnij przycisk Load. W siatce danych pojawią sie dane. Gratulacje, właśnie stworzyłeś otwartą na Internet aplikację klienta. Ani BDE jak i biblioteki klienta InterBase nie są potrzebne na komputerze klienta.