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.

Podobne dokumenty