Komunikator w Delphi

W pierwszej części kursu programowania internetowego w Delphi pokażemy, w jaki sposób nawiązać łączność za pomocą protokołu TCP/IP. Mimo że naturalnym językiem do programowania tego rodzaju aplikacji wydaje się język Java ze swoją bogatą biblioteką funkcji internetowych, programiści Delphi wcale nie są w gorszej sytuacji.

W pierwszej części kursu programowania internetowego w Delphi pokażemy, w jaki sposób nawiązać łączność za pomocą protokołu TCP/IP. Mimo że naturalnym językiem do programowania tego rodzaju aplikacji wydaje się język Java ze swoją bogatą biblioteką funkcji internetowych, programiści Delphi wcale nie są w gorszej sytuacji.

Jest wiele różnych metod programowania aplikacji internetowych.

W tej części opiszemy dwa podstawowe komponenty internetowe, które znajdziesz w prawie każdej wersji Delphi (oprócz Delphi 7 Personal). Komponenty te zawierają typowe właściwości, metody i zdarzenia, z którymi zetkniesz się podczas pisania kolejnych programów. Pierwszym projektem, który zrealizujemy, to prosty komunikator, umożliwiający dwóm osobom rozmowę (chat) przez Internet. Do napisania tego i następnych programów wykorzystamy Delphi 6 Enterprise (wersja Trial była na naszych płytach, ale można ją również ściągnąć ze strony http://www.borland.com ).

Graficzny interfejs aplikacji nie jest zbyt złożony. Opiszemy krótko funkcje tylko niektórych elementów, gdyż gotowy projekt znajduje się na płycie.

I tak komponent TMemo służy do wyświetlania treści rozmowy, TEdit - do wpisywania tekstu, który chcesz wysłać drugiej osobie, kliknięcie TButton powoduje wysłanie tekstu, a TMainMenu zawiera dwie pozycje, które służą do nawiązania połączenia.

Interfejs aplikacji, poza typowymi komponentami wizualnymi, zawiera składniki służące do komunikacji przez Internet.

Interfejs aplikacji, poza typowymi komponentami wizualnymi, zawiera składniki służące do komunikacji przez Internet.

Na formularzu umieść też dwa kluczowe dla działania aplikacji komponenty, czyli TServerSocket i TClientSocket z karty Internet (użytkownicy Delphi 7 w wersjach wyższych niż Personal będą korzystali odpowiednio z TTcpServer i TTcpClient oraz nieznacznie zmienionych nazw właściwości). Są to komponenty niewizualne i służą do obsługiwania połączenia internetowego. Oba pełnią funkcję gniazdek komunikacyjnych TCP/IP - pierwszy po stronie serwera, a drugi po stronie klienta.

TServerSocket jest bierny, co oznacza, że sam nie nawiązuje połączenia, tylko czeka, aż ktoś inny się z nim połączy, a TClientSocket to jego przeciwieństwo. Wymaga podania adresu komputera-serwera, a następnie próbuje nawiązać połączenie. Jeśli mu się nie uda, generuje błąd. Właściwość Port (liczba z zakresu 0-65535) obydwu komponentów musi być identyczna, ponieważ w przypadku serwera oznacza numer portu, w którym serwer czeka na połączenia, a w przypadku klienta oznacza ten sam numer portu serwera, do którego chcesz się podłączyć. W naszym przykładzie numer portu to 35353.

Komponenty TServerSocket i TClientSocket znajdziemy na karcie Internet. W wersjach Professional i Enterprise jest również wiele innych innych komponentów przydatnych do tworzenia aplikacji internetowych.

Komponenty TServerSocket i TClientSocket znajdziemy na karcie Internet. W wersjach Professional i Enterprise jest również wiele innych innych komponentów przydatnych do tworzenia aplikacji internetowych.

Pierwszą czynnością, jaką musi wykonać program przed rozmową, jest nawiązanie połączenia. W komponencie TServerSocket wystarczy wywołać jego metodę Open, która otworzy gniazdko i umożliwi podłączenie się klientów. W przypadku TClientSocket, należy najpierw ustalić adres serwera i dopiero potem wywołać metodę Open.

Po wprowadzeniu adresu serwera, możesz spróbować nawiązać połączenie. Najpierw trzeba jednak sprawdzić, czy z gniazdek, którymi chcesz się posłużyć, nie korzysta inne połączenie. Jeżeli tak, to przed nawiązaniem połączenia należy je zamknąć. Połączenie otworzysz następująco:

s:=inputbox('Wprowadź adres hosta:',",");

// wprowadzamy adres (IP lub słowny)

if ClientSocket1.Active then ClientSocket1.Close;

if ServerSocket1.Active then ServerSocket1.Close;

// zamykamy ewentualne połączenia

if (checkznak(s)) then

ClientSocket1.Host:=s

// jeśli adres został podany w postaci słownej

// to przypisujemy go do właściwości Host

else

ClientSocket1.Address:=s;

//a w przeciwnym razie do właściwości Address

ClientSocket1.Open;

// próbujemy nawiązać połączenie

Po połączeniu się obydwu komputerów można przejść do wysyłania i odbierania tekstów. Teksty wysyłamy za pomocą specjalnych metod, dostępnych w komponentach TClientSocket oraz TServerSocket:

TClientSocket.Socket.SendText(s:string)

TServerSocket.Socket.Connections[indeks].

SendText(s:string)

Inaczej wysyłasz więc tekst, gdy program pełni funkcję serwera, a inaczej, gdy działa jako klient:

if ClientSocket1.Active then

ClientSocket1.Socket.SendText(Edit1.Text);

// jeśli program działa jako klient

// to wysyłamy przez klienta

if ServerSocket1.Active then

ServerSocket1.Socket.Connections[0].

Sendtext(Edit1.Text);

// jeśli program działa jako serwer

// to wysyłamy przez serwer

Memo1.Lines.Add('>'+Edit1.Text);

// dodajemy tekst do komponentu Memo1

Edit1.Text:='';

// przygotowujemy pole tekstowe

// do wpisania kolejnego tekstu

Odbieranie tekstu odbywa się w procedurach obsługi zdarzeń onRead lub onClientRead (w zależności od komponentu) i wygląda tak samo dla serwera i klienta. Oba zdarzenia przekazują do procedury obsługi parametr Socket typu TCustomWinSocket, który zawiera metodę ReceiveText. W związku z tym, aby dodać przesłany tekst do komponentu TMemo, wystarczy wpisać jeden wiersz kodu:

Memo1.Lines.Add(Socket.ReceiveText);

Jeszcze jedną ważną kwestią jest ograniczenie liczby nadchodzących połączeń. Zakładamy w programie, że w danym momencie tylko jeden klient może się podłączyć do serwera, ponieważ jest to komunikator dla dwóch osób. Do kontroli liczby połączeń wykorzystamy właściwość ActiveConnections komponentu TServerSocket, która zwraca liczbę podłączonych klientów:

if ServerSocket1.Socket.ActiveConnections>1 then

// jeśli mamy już jedno połączenie

begin

socket.sendtext('>>>Serwer zajęty!');

// przesylamy odpowiedni komunikat

ServerSocket1.Socket.Connections[1].Close;

// i zamykamy to połączenie

end;

Jeśli podłączony jest już jeden klient i chce to zrobić kolejny, informujemy go, że serwer jest zajęty, i zamykamy połączenie.


Zobacz również