artykuły

Delphi - Klient-serwer na TCP/IP

8:26
Thu, 14 April 2005
Tekst wprowadza czytelnika w świat aplikacji sieciowych. Jak napisać komunikujące się między sobą programy? Jak sterować innym komputerem przez sieć? Artykuł odpowiada na te pytania.

Wstęp

Czy chciałeś kiedyś napisać własneg cz@ta, program do transmisji danych lub inne ustrojstwo? Wśród programistów panuje przekonanie, że pisanie aplikacji sieciowych to jedno z trudniejszych zajęć. Faktycznie, jest w tym ziarno prawdy. Na szczęście dzięki Delphi poradzimy sobie z tym za pomocą dosłownie kilkunastu linijek kodu. W naszym programie wykorzystamy komponenty ClientSocket i ServerSocket standardowo dostępne w Delphi 6 (zakładka Internet). Niestety, posiadacze Delphi 7 nie znajdą tych komponentów. W wersji 7 komponenty te są opcjonalne, aby z nich skorzystać należy je samodzielnie zainstalować (korzystamy przy tym z polecenia "Install Packages" z menu "Component" wybierając plik "dclsockets90.bpl", znajdujący się w podkatalogu "<katalog z Delphi>\bin") - jeśli również tam ich nie ma, pobieramy je z LHP. Dlaczego tak jest? Chyba dlatego, aby mniej doświadczeni użytkownicy nie mogli tak łatwo napisać konia trojańskiego. Cóż, zabieramy się do roboty!

Piszemy konia trojańskiego ;)

Oczywiście informacje zawarte w tym artykule służą wyłącznie celom edukacyjnym ;)

Serwer (czyli program, który będzie wykonywał zadania wysłane od klienta)

  1. Uruchomcie Delphiego.
  2. Kliknijcie na formularz i w Inspektorze Obiektów zmieńcie jego właściwość Caption na "Serwer".
  3. Przejdźcie do Edytora kodu (klawisz F12) i na samej górze modułu, do listyusesdodajcie słówko MMSystem. Umożliwi nam ono wysuwanie i wsuwanie szufladki CD. Listausespowinna teraz wyglądać następująco:

    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, MMSystem;
  4. Postawcie na formularzu komponent ServerSocket z zakładki Internet.
    W Inspektorze Obiektów zmieńcie jego właściwość Name na "Serwer",
    zmieńcie również właściwość Port na np. 8686 (oba nasze programy, zarówno serwer, jak i klient, którego napiszemy później, muszą komunikować się na tym samym porcie). Nasz serwer będzie nasłuchiwał rozkazów klienta na porcie 8686. Numer portu może być dowolnym numerem, tyle tylko, że nie może być on już wykorzystywany (macie tutaj program który pozwoli wam sprawdzić czy podany port jest już wykorzystywany).
    Ustawcie jeszcze właściwość Active na True (oznacza ona, że wtyczka będzie aktywna już przy uruchomieniu programu).
  5. W Inspektorze Obiektów przejdźcie do zakładki Events (zdarzenia). Odszukajcie zdarzenie "OnClientRead" i kliknijcie dwukrotnie w puste pole obok. Zostanie wygenerowana procedura, która będzie wywoływana wtedy, gdy klient prześle jakieś dane. Wpiszcie do niej następujące linie:

    procedure TForm1.SerwerClientRead(Sender: TObject; Socket: TCustomWinSocket); var komenda : string; begin // Przypisujemy otrzymany od klienta tekst do zmiennej komenda := Socket.ReceiveText; if komenda = 'otwórz CD' Then mciSendString('Set cdaudio door open wait',nil,0,handle); // Wysuń szufladkę if komenda = 'zamknij CD' Then mciSendString('Set cdaudio door closed wait',nil,0,handle); // Wsuń szufladkę if komenda = 'wyłącz kompa' Then ExitWindowsEx( EWX_SHUTDOWN,0 ); // Wyłączenie komputera if komenda = 'wyświetl błąd' Then MessageBox(Handle,'Wystąpił straszny błąd. Nic się nie stało ;)','Błędny błąd',MB_OK+MB_ICONERROR); end;
  6. To wszystko jak na serwer. Zapisujemy program.

Klient (czyli program, który będzie wysyłał zadania do serwera, czyt. rozkazywał serwerowi)

  1. Utwórzcie nowy projekt (File > New > Application).
  2. Kliknijcie na formularz i w Inspektorze Obiektów zmieńcie jego właściwość Caption na "Klient".
  3. Postawcie na formularzu komponent ClientSocket z zakładki Internet.
    W Inspektorze Obiektów zmieńcie jego właściwość Name na "Klient",
    zmieńcie właściwość Port na taką samą jaką ustawiliście w serwerze.
  4. Postawcie na formie komponent Edit (paleta Standard). W Inspektorze Obiektów, wymarzcie jego właściwość Text.
  5. Postawcie na formie przycisk (Button). (paleta Standard). W Inspektorze Obiektów, zmieńcie jego właściwość Caption na "Połącz".
  6. Kliknijcie dwukrotnie na przycisk. Do procedury która się ukaże, wpiszcie coś takiego: // Przypisujemy wpisany przez użytkownika adres IP do komponentu Klient.Address := Edit1.Text; // Aktywujemy komponent (włączamy go) Klient.Active := True;
  7. Połóżcie na formie jeszcze 4 przyciski (tak by wszystkich było 5 ;). Będą one odpowiadały poszczególnym rozkazom.
    W Inspektorze Obiektów, zmieńcie właściwości Caption położonych przycisków na kolejno: "Wysuń CD", "Wsuń CD", "Wyłącz zdalny komputer", "Wyświetl błąd".
  8. Kliknijcie dwukrotnie na przycisk z etykietą "Wysuń CD". Do procedury, która się pojawi, wpiszcie następujący kod:
    Klient.Socket.SendText('otwórz CD');
  9. Kliknijcie dwukrotnie na przycisk z etykietą "Wsuń CD". Do procedury, która się pojawi, wpiszcie następujący kod:
    Klient.Socket.SendText('zamknij CD');
  10. Kliknijcie dwukrotnie na przycisk z etykietą "Wyłącz zdalny komputer". Do procedury, która się pojawi, wpiszcie następujący kod:
    Klient.Socket.SendText('wyłącz kompa');
  11. Kliknijcie dwukrotnie na przycisk z etykietą "Wyświetl błąd". Do procedury, która się pojawi, wpiszcie następujący kod:
    Klient.Socket.SendText('wyświetl błąd');
  12. Zapiszcie klienta i KONIEC!

Testowanie programów na tym samym komputerze

To już wszystko. Teraz wypadałoby przetestować obie aplikacje. Najlepiej to zrobić, kiedy mamy w domu dwa komputery połączone siecią. A nie każdy ma w domu dwa komputery połączone siecią ;) Dlatego jest jeden sposób by sprawdzić działanie obu programów na jednym i tym samym komputerze.
Okazuje się, że komputer na którym pracujemy ma swój stały, lokalny adres. Jest on następujący : 127.0.0.1 . Służy on do tworzenia tzw. pętli zwrotnej (informacje wychodzące z komputera znów do niego trafiają). Dlatego możemy teraz uruchomić oba programy (klienta i serwera), w kliencie wpisać w pole tekstowe adres 127.0.0.1 i ponaciskać różne przyciski, np. przycisk "Wyświetl błąd". I sprawdzić, czy serwer wyświetli błąd.

Testowanie programów na różnych komputerach

Aby przetestować programy na połączonych siecią komputerach, wystarczy włączyć na jednym komputerze program "Klient", a na drugim "Serwer". W programie "Klient" wpisać adres IP komputera na którym znajduje się serwer. Jeśli go nie znamy to patrzymy poniżej.

Jak poznać adres IP mojego komputera?

Aby dowiedzieć się jaki adres został przydzielony naszemu komputerowi, musimy najpierw znać jego nazwę. 
Dla systemu WindowsXP : Nazwa komputera widnieje na zakładce "Nazwa komputera" ;) w aplecie "System" w Panelu Sterowania.
Dla systemu Windows 98: Nazwa komputera widnieje na zakładce "Identyfikacja" w aplecie "Sieć" w Panelu Sterowania.
Gdy znamy już nazwę komputera, musimy ją zamienić na adres. W tym zadaniu pomoże nam program "ping". Aby go użyć musimy otworzyć wiersz poleceń, czyli wybrać z menu...:

W przypadku systemu Windows XP:

Start > Wszystkie programy > Akcesoria > Wiersz polecenia
Wpisujemy komendę:ipconfig /alli odnajdujemy w wyświetlonych danych naszą kartę sieciową która łączy nas z Internetem, po czym odczytujemy jej adres IP. Problem w tym, że kiedy jesteśmy w sieci lokalnej LAN, uzyskamy tą drogą jedynie wewnętrzny adres IP i będziemy mogli połączyć się jedynie z komputerem z naszej podsieci. Aby tego uniknąć - odpisz sobie swój zewnętrzny adres IP (ten pod którym jesteś widziany w Internecie) korzystając ze skryptu: Twój zewnętrzny adres IP

W przypadku systemu Windows 98:

Start > Programy > Tryb MS-DOS
Gdy mamy już otwarte okno wiersza polecenia, wpisujemy weń: polecenie:ping [spacja] [nazwa komputera]Po chwili wyskoczy nam adres IP naszego komputera. Problem w tym, że kiedy jesteśmy w sieci lokalnej LAN, uzyskamy tą drogą jedynie wewnętrzny adres IP i będziemy mogli połączyć się jedynie z komputerem z naszej podsieci. Aby tego uniknąć - odpisz sobie swój zewnętrzny adres IP (ten pod którym jesteś widziany w Internecie) korzystając ze skryptu: Twój zewnętrzny adres IP

Zakończenie

Dzięki wszystkim za uwagę. Jeśliby coś nie działało (co bardzo często zdarza się przy aplikacjach sieciowych), mejl me. Jeśli wszystko działa to świetnie ;) Do artykułu dołączam jak zwykle źródełko.

Listy od czytelników

Asynchronous socket error 10061 - pytania Pana Mateusza F. i moje odpowiedzi (przypadek dotyczy braku komunikacji klienta z serwerem, ponieważ czytelnik nie mógł skompilować programu serwera ze względu na program antywirusowy, który w napisanym przez czytelnika programie serwera dopatrywał się konia trojańskiego. Czytelnik próbował uruchomić sam program klienta, który z kolei nie mógł znaleźć serwera - stąd błąd gniazdka nr 10061)

witam, zwracam sie do Pana z prośba o pomoc, probowałem zrobić program z Pana strony dokladnie http://www.lukashp.pl/artykuly/delphi-klient_serwer_tcp_ip.php nawet pobrałem gotowy program i wywala mi taki błąd i nie bardzo wiem co zrobic. [tu następuje screen z włączonym programem klienta (brak włączonego programu serwera) i komunikatem błędu asynchronous socket error 10061].

Cześć, witaj! Zaraz dojdziemy co jest nie tak (mam nadzieję). Taki błąd najczęściej oznacza, że program klienta nie może się połączyć z programem serwera. Czy masz uruchomiony program serwera? Bo na pasku zadań widzę tylko program klienta ;-) Pisana aplikacja działa tak: mamy dwa programy - jeden na komputerze ofiary (serwer) a drugi u nas (klient). Klient łączy się z serwerem i wysyła mu polecenia, a serwer je realizuje (np. wywołuje funkcję otwierającą szyfladkę CD).
Jeśli program klienta nie może się połączyć z programem serwera to najczęściej występuje właśnie błąd 10061 (opisy pozostałych błędów znajdziesz jak zwykle na MSDN (dokumentacji API Windowsów) http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx ). Najlepiej najpierw uruchomić w tle program serwera, a następnie testować program klienta. Z wyłączaniem odwrotnie - najpierw zamykamy klienta a potem zamykamy serwer.

Jeśli natomiast masz uruchomiony program serwera, a ja się go niedopatrzyłem to być może Firewall wbudowany w Vistę tutaj blokuje połączenia. W takim wypadku należy sprawdzić czy w ustawieniach firewalla port na którym działa nasz program nie jest przypadkiem zablokowany.

Jeśli by to nie pomogło - pisz śmiało!

problem w tym ze ma plik klient.exe i on sie ładnie uruchamia, ale nie ma pliku serwer.exe i gdy włączam przez delphi program serwer i daje run to wyskakuje mi błąd ze nie mam pliku serwer.exe a do tego wyskakuje mi informacja ze znalazlo trojana, jak wyłącze antywirusa to ten sam bład wysakuje.. a i ja mam Xp tylko sp3 i wyglada jak Vista dziekuje za pomoc :)

Czekaj, bo nie za bardzo rozumiem treść Twojego listu, ale OK ;) Do mnie trzeba jasno, bo ja głupi jestem. Więc jaką mamy teraz sytuację? Piszesz, że wyskakuje błąd oznajmiający, że nie ma pliku "serwer.exe". Rozumiem, że ów błąd wyskakuje nie jako tabliczka, ale pojawia się w komunikatach dotyczących kompilacji (w oknie z kodem projektu). Być może antywirus cały czas blokuje plik projektu (tak, nawet jak jest niby "wyłączony").

Musisz sobie jakoś poradzić z kompilacją serwera, no bo bez niego ani rusz. Myślę, że ponowne uruchomienie kompa i wyłączenie antywirusa zanim zabierzesz się jeszcze za jakąkolwiek robotę może załatwić problem.
Natomiast jeśli nie pomoże - to zakomentuj w kodzie te linijki odpowiadające za wysuwanie i wsuwanie szuflady CD - antywirus powinien przestać się czepiać i powinien przestać uznawać program za konia trojańskiego.

dzięki straszne, tak jak mówiłeś za komentowałem linijki odpowiadające wysuwaniu szuflady Cd i wszystko gra jeszcze raz wielkie dzienki :) pozdrawiam

witam, ponownie przepraszam ze tak mecze ale chciałem napisać ze udało mi sie uruchomić cały serwer łącznie z opcja wysuń/wsuń cd.. używam antywirusa NOD i w jego opcjach od klikałem wszelkie możliwe opcje ochrony i serwer poprawnie mi sie skompilował jeszcze raz dziękuje za Pana czas i chęć pomocy :) pozdrawiam

12345
Delphi - Klient-serwer na TCP/IP Autor opinii: Czytelnicy, data przesłania: 5

Podobne artykuly:

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    • kbr
    • Tue, 28 July 2020, 9:35
    • Kiedyś napisałem program (w Delphi XE7), który łączył się przez sockety w sposób opisany przez Pana wszystko działało super (klient). Dziś jak włącze ten program, to wyskakuje błąd (w tym przypadku to nie wyjątek) Connection Closed Gracefully. Dlaczego? Pocket Sender działa i wysyła pakiety danych do serwera i dostaje odpowiedź. W regułach zapory również ustawiłem wszystko na zezwolenie, ale nadal program nie wysyła i nie odbiera danych z serwera. Ma Pan jakąś radę?
    • TomRiddle
    • Tue, 3 May 2011, 0:15
    • Skąd ja to znam, panie Wyporek? :D

      @pawel0789
      Nie kminisz? Napisz na gg 5228983
    • pawel0789
    • Sat, 9 April 2011, 10:21
    • Nic nie pomogło nadal nie działa wyłączenie monitora:(
      A co do ikon to nie mam pojęcia co z tym kodem zrobić:(
      Może to przez to że ma windows 7???
    • pawel0789
    • Fri, 1 April 2011, 16:37
    • Błagam opisz to wszystko tak jak opisałeś aplikację klient-serwer bo ja już siły do tego nie mam tak jak powyżesz krok po kroku.
      Proszę.
    • pawel0789
    • Wed, 30 March 2011, 18:54
    • Mam jeszcze takie problemy z programem. otóż do dałem jeszcze kilka buttonów o nazwach wylacz monitor, włacz monitor, ukryj ikony,pokaz ikony, ukryj kursor, pokaz kursor; do przycisku wyłącz monitor wpisałem: Klient.Socket.SendText('monitoroff');
      - włącz monitor wpisałem:Klient.Socket.SendText('monitoron');
      -ukryj ikony wpisałem:
      Klient.Socket.SendText('ukryj ikony');
      -do pokaz ikony wpisałem:
      Klient.Socket.SendText('pokaz ikony');
      tak samo dla kursora.
      Do serwera wpisałem:
      if komenda ='monitor0' then
      SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,1);
      if komenda ='monitor1' then
      SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,-1);
      if komenda = 'ukryj ikony' then
      ShowWindow(Uchwyt, SW_HIDE);
      if komenda= 'pokaz ikony' then
      ShowWindow(Uchwyt, SW_SHOW);
      if komenda = 'ukryj kursor' then
      ShowCursor(False);
      if komendA = 'pokaz kursor' then
      ShowCursor(True);
      i nie wiem dlaczego te polecenia nie działają!
      Jeśli bedzie trzeba wyślę swój program Panu na emila.
      Za pomoc dziękuje




      Odp: Witam. Po pierwsze, w kliencie wysyłasz 'monitoroff', a w serwerze nasłuchujesz 'monitor0'. Pisałeś wcześniej, że program działa bez problemu, więc zakładam, że wysuwanie szufladki i inne funkcje działają poprawnie, stąd zakładam, że jest komunikacja pomiędzy klientem a serwerem. Spróbuj jako ostatni parametr w funkcji wysyłającej komunikat systemowy dot. wyłączenia wyświetlacza wpisać zamiast 1 cyfrę 2. Powinno pomóc.


      Jeśli chodzi o ukrywanie ikon na pulpicie, to należy najpierw odszukać uchwyt okna pulpitu, a właściwie ProgMan'a, czyli (niezmiennego od Windows 3.11 Menadżera Programów - czyli programu odpowiadającego za graficzny interfejs użytkownika (GUI)). Potem należy wysłać do tego okna komunikat mówiący o tym, że ma się ukryć. I koniec. Spróbuj takiego kodu:

      var
      uchwyt : THandle;
      begin
      uchwyt := FindWindow('ProgMan', nil);
      uchwyt := GetWindow(uchwyt, GW_CHILD);
      ShowWindow(uchwyt, SW_HIDE);
    • pawel0789
    • Wed, 30 March 2011, 16:12
    • Jesetm początkującym użytkownikiem Delphi. I chodzi mi o to jaką komendę przypisać do klient a jaką do serwera żeby był wybór: wyłącz komputer, uruchom ponownie.
      A z kurorem to chodzi o to żebym nim mógł poruszać (siedząc przy komputerze gdzie jest uruchomiony klient po kliknięciu przycisku button'a mógł poruszać kursorym na drugim komputerze gdzie tam gdzie jest uruchomony serwer).




      Odp: Hehe :) Ah Ci początkujący... ;) Nie powiem Ci nic więcej. Powiedziałem Ci jakiej funkcji użyć aby ustawić kursor i jakiej funkcji użyć aby pobrać pozycję kursora. Wiesz jak przesyłać dane między klientem a serwerem. Czego Ci brakuje?

      Jest taki fajny komponent - Timer się nazywa. Służy do cyklicznego wywoływania funkcji (co ustalony przedział czasu). To tyle.
    • pawel0789
    • Thu, 24 March 2011, 9:54
    • A z wyłączeniem komputera nie mogłem sobie poradzić, jeśli można prosić o opis będę wdzięczny.




      Odp: Nie za bardzo jest co opisywać. Wspomniana procedura zamykania systemów (również Visty i Win7) z podanej przeze mnie strony działa znakomicie, o czym przekonałem się będąc zmuszony drugi raz pisać odpowiedź na Pana pytanie po niefortunnym zamknięciu systemu :-)

      Gdzie ma Pan problem? Wystarczy dopisać do klienta kod odpowiedzialny za wysyłanie komendy "zamknij", a do serwera, kod obsługujący komendę "zamknij" reagujący na nią wywołaniem procedury:

      MyExitWindows(EWX_POWEROFF or EWX_FORCE);
    • pawel0789
    • Thu, 24 March 2011, 9:52
    • Kursor ustawia się w lewym górnym rogu! Ale pytanie teraz jak nim ruszać za pomocą myszki???




      Odp: Z czym ma Pan problem? Z pobieraniem pozycji kursora po stronie klienta, czy przesyłaniem pozycji kursora z klienta do serwera?
      Aby pobrać pozycję kursora wystarczą dwie linijki kodu:

      var
      poz : TPoint;
      begin
      GetCursorPos(poz);

    • TomRiddle
    • Sun, 21 November 2010, 17:27
    • Znalazłem sposób na znalezienie IP w Windows 7, tak żeby aplikacje Klient Server działały.
      Prawym Klawiszem na Sieć
      >> Właściwości
      >> Zmień Ustawienia Karty Graficznej
      >> //Wybieramy nasze połączenie
      >> Szczegóły.
      W wierszu IPv4 adres IP.




      Odp: To jest zła metoda, ponieważ często nie wskazuje jaki masz adres IP zewnętrzny, ale wskazuje raczej IP wewnętrzny.

      Rozrysuje Ci to. Jeśli masz taki schemat połączenia z siecią:


      INTERNET
      |
      TWÓJ ROUTER (lub ROUTER z modemem)
      | | |
      KOMPUTER1 KOMPUTER2 KOMPUTER3


      To ta metoda jest zła. Czyli dla wszystkich sieci osiedlowych, blokowych itp... jest to najczęściej zła metoda. Owszem, komunikacja zadziała - ale tylko na innym komputerze w sieci wewnętrznej.

      Natomiast jest to metoda dobra, jeśli Twoje łącze internetowe jest bezpośrednie, tzn... kiedy uzyskujesz bezpośredni, publiczny adres IP. Najczęściej przy takim schemacie:


      INTERNET
      |
      MODEM (kablowy, światłowodowy lub telefoniczny)
      |
      KOMPUTER


      Podsumowując, chodzi o to, że sprawdzanie adresu IP, takie jakie ty przeprowadzasz podaje Ci tylko adres IP pod jakim znają Cię Twoje komputery w sieci wewnętrznej. Łącząc się pod ten adres np. z Japoni... nie połączyłbyś się z niczym. W pierwszym schemacie, dopiero router posiada jeden publiczny adres. Dlatego aby sprawdzić swój publiczny adres, musisz się połączyć z routerem, albo z czymś co stoi nad routerem (dowolny serwer internetowy). Dlatego proponuje Ci skorzystanie np. z serwisu: http://www.adres-ip.pl/ - poda Ci Twój publiczny adres IP.
      W pierwszym przypadku jest jeszcze jedna kwestia... tzw. odpowiedniego przekierowania portów. O ile w drugim przypadku nie jest to potrzebne (ponieważ wszystkie połączenia z zewnątrz są przekazywane na porty podpiętego do modemu komputera), o tyle już w pierwszym przypadku, gdy przychodzi połączenie z zewnątrz, nie za bardzo wiadomo na który komputer je przekierować. Dlatego trzeba dać routerowi twojej sieci do zrozumienia, że kiedy przychodzi z zewnątrz połączenie na port 4435 to ma je przekazać do komputera w sieci wewnętrznej o adresie wewnętrznym np. 192.168.0.42 (też na port 4435).



      Nom. To tak skrótowo (ale porządnie). Sam wybierz, z którego schematu Ty korzystasz. W skrócie - Twoja metoda dobra, gdy masz modem, zła gdy masz router (sieć blokową).



      Pozdrawiam!
    • sproket
    • Wed, 10 November 2010, 12:22
    • Witam. Bardzo fajna stronka. Doskonały opis. Mam tylko pytanko jak wcielić w życie taki problem. Otóż komputer połączony z urządzeniem elektronicznym (np. miernik wagowy). Miernik ten wpięty poprzez ethernet w sieć. Chciałbym "rozmawiać" z nim z kilku komputerów w sieci. Nie bardzo wiem jak to ogarnąć. Dopiero zaczynam przygodę z funkcjami sieciowymi. Pozdrawiam.




      Odp: Witam serdecznie. Problemy się rozwiązuje, a nie wciela w życie ;-) Choć niektórzy faktycznie wcielają je w życie ;-) Na problem o którym piszesz należy spojrzeć tak. Jeśli waga komunikuje się przez Ethernet, to zapewne korzysta z jednego z dwóch protokołów - TCP lub UDP, ma swój adres IP oraz port na którym nasłuchuje poleceń - bo zapewne jest serwerem (gdyby była klientem to ona łączyłaby się z określonym portem na Twoim komputerze). Musisz więc poznać jej adres IP, port na którym nasłuchuje i dowiedzieć się czy masz korzystać z protokołu TCP czy UDP - ten drugi jest prostszy, ale nie masz gwarancji dostarczenia pakietu (różnica pomiędzy nimi jest taka, że TCP tworzy "połączenie" żądając wysłania zwrotnego pakietu ACK przez zdalną maszyną po każdorazowym odebraniu danych, natomiast UDP jest bezpołączeniowe - po prostu dane są wysyłane i nie wiadomo co się z nimi dzieje).
    • Maxzby
    • Tue, 12 October 2010, 0:07
    • Witam ostatnio ja trochę źle sformułowałem pytanie. Mianowicie chce napisac program w delphi, który połączy sie z mojim routerem poda login, hasło następnie wyśle komende która rozłączy moj router i połączy go ponownie. Język w jakism jest zaprogrmaowany router to java a ja nie wiem jak umieścic skrypt javy w delphi i za pomoća jakiej procedury sprawićalby program sie połączył z routerem podał log i hasło. Bede wdzieczny za pomoc sporo szukałem w internecie i stanąłem narazie na Java Native Interface, któego do końca nie rozumiem działania i nie wiem czy w ogóle obrałem dobry kierunek. Z góry dzięki za pomoc




      Odp: Java Native Interface pozwala na wywołanie w Javie kodu z biblioteki napisanej w innym języku. Idziesz złą drogą, skoro program musisz napisać w Delphi. Problem w tym, że jakoś musisz komunikować się z routerem po Ethernecie, a do tego celu potrzebujesz rozpiskę protokołu komunikacyjnego tego urządzenia. Ewentualnie, jeśli masz dostęp do panelu administacyjnego routera z poziomu przeglądarki internetowej to problem się rozwiązuje - zaopatrz się w sniffer (np. IP Sniffer, SmartSniff lub Ethereal), wyłącz wszystkie programy sieciowe (prócz sniffera i przeglądarki), włącz przechwytywanie TCP/IP, zaloguj się za pomocą przeglądarki na routerze i wydaj polecenie resetowania po czym zatrzymaj sniffing. Zapisz sniffing do pliku i już będziesz miał informacje o tym co i w jakiej kolejności należy wysłać do routera aby wykonać żądaną czynność (reset routera). Oczywiście musisz zaznajomić się troszkę z protokołem HTTP (ale wierz mi - to jest kilkanaście minut). Ot taki pomysł.
      Gorzej jeśli nie masz dostępu do panelu administracyjnego z poziomu przeglądarki - wtedy jest trudniej jeśli nie znasz protokołu komunikacyjnego, ponieważ w takim przypadku ze Sniffingu trudno jest cokolwiek wywnioskować. Pzdr.
    • marcinos
    • Thu, 7 October 2010, 18:37
    • Czy da sie nawiazac polaczenie z klientem od strony servera? Chcialbym by proram polaczyl sie z kilkoma klientami np. 4, wyslal do nich instrukcje i oczekiwal na transmisje od klientow.




      Odp: Nie. Serwer to narzędzie do nasłuchu czy jakieś połączenia nie nadchodzą. Musisz to zrobić odwrotnie. U użytkowników zamontować serwery, a sam być klientem, który np. żąda od serwera wysłania danych.
    • TomRiddle
    • Thu, 15 July 2010, 16:35
    • Jeszcze jedno wtrącę.
      Czytałem inny Artykuł, i Pod Button1(Połącz) może wartało by dodać:

      Klient.Host := Edit3.Text;

      Tylko nie wiem co tam wpisac?
      Co to w ogóle jest ten Host SMPT?




      Odp. Hostem nazywamy po prostu jakąś maszynę z którą się łączymy (np. serwer, czy nasz komputer - gdy podłączamy do niego komórkę przez USB).
      W programowaniu przyjęło się nazywać hostem nazwę komputera, zastępującą jego adres IP. Czyli adresem IP Onetu będzie 213.180.146.27, ale hostem jest www.onet.pl. Inne przykłady hostów:


      chello084204128.upc.pl

      (czy jakoś podobnie - to nazwy nadawane komputerom w sieci kablowej UPC)


      Host SMTP to nic innego jak komputer z oprogramowaniem świadczącym usługi wysyłki poczty elektronicznej. Gdy wysyłasz list, pierwszym serwerem do którego wędruje Twój list, jest właśnie serwer SMTP firmy u której masz konto e-mail, np. smtp.gmail.com, czy smtp.poczta.onet.pl. Później taki list przechodzi przez kolejne serwery SMTP (pośrednie) nim dotrze do komputera firmy u której konto ma adresat listu.
    • TomRiddle
    • Thu, 15 July 2010, 12:41
    • A jak sprawdzić zewnętrzny Ip w Windows 7?




      Odp: Ze względu na różne sposoby dostarczania internetu przez ISP, najlepiej to robić przez zewnętrzne serwisy takie jak:

      http://www.lukas-home-page.ovh.org/twoje_ip.php
    • Pirotechnik
    • Mon, 12 July 2010, 11:11
    • Pytanie już nieaktualne ;)
    • Pirotechnik
    • Sat, 10 July 2010, 19:44
    • A w jaki sposób serwer może odpowiedzieć klientowi po dostaniu ustalonej komendy? Trzeba znać adres IP klienta czy może jest jakiś sposób aby "odczytać" ten adres po dostaniu komendy od klienta?
    • Disip
    • Tue, 1 June 2010, 17:28
    • NUMER_POLACZENIA to dosłownie numer połączenia, czyli np. mam trzech klientów, gdy wpiszę jako NUMER-POLACZENIA "2" to rozłączy mnie z drugim?
      Hmm... Nie da się tego jakoś zrobić, by rozłączać znając tylko uchwyt?

      Oczywiście dziękuję za radę, narazie mi wystarczy :)




      Odp: To zależy jakiego rodzaju uchwyt masz na myśli? Rozumiem, że jest to uchwyt gniazdka odbierającego N-te połączenie. W takim razie wystarczy zrobić pętlę po wszystkich połączeniach, i wyszukać to gniazdko które ma:


      ServerSocket1.Socket.Connections[i].SocketHandle;


      równe co do wartości temu poszukiwanemu. Z drugiej strony jednak zastanawiam się, jak ty piszesz ten program skoro operujesz jednocześnie na komponentach i uchwytach. Dawniej (w czasach czystego WinSock) faktycznie identyfikowało się gniazdka za pomocą uchwytów, ale teraz, w świecie obiektowym jest to obiekt często właśnie zagregowany jako jeden z elementów tablicy otwartych połączeń.
      Pozdrawiam!
    • Disip
    • Mon, 31 May 2010, 19:33
    • To znowu ja, i znów mam pytanie :)

      W jaki sposób można od strony serwera rozłączyć się tylko z jednym klientem znając jego uchwyt, podczas gdy reszta klientów będzie nadal połączona? Chcę zrobić opcję wywalania z pokoju ludzi, którzy niefajnie się zachowują... Tylko jak? ;)

      Pozdrawiam!




      Odp: Aby rozłączyć się z wybranym klientem można użyć takiej instrukcji:

      ServerSocket1.Socket.Connections[NUMER_POLACZENIA].Close();


      Lub, w procedurze obsługi zdarzenia ClientRead, można zamknąć gniazdko z którego pobieramy informacje w ten sposób:


      Socket.Close();


      P.S. Polecam zrobić jeszcze bana na hosta, albo IP.

      Również pozdrawiam!
    • RDX
    • Sun, 9 May 2010, 22:31
    • a co z komunikacja przez internet?




      Odp: A jest jakiś problem? Odbywa się przez ten sam protokół co w sieci Ethernet (LAN). Z punktu widzenia programisty Internet i sieć lokalna są sieciami nierozróżnialnymi, tzn. nie musimy w programie nic zmieniać aby napisana przez nas aplikacja działała poprzez Internet. Z drugiej strony jednak częstym problemem są tzw. Firewalle i rozwiązania oparte o NAT. Rozwiązania oparte o NAT utrudniają postawienie serwera który byłby widzialny z zewnątrz (czyli z sieci Internet).
    • Stanley71
    • Fri, 26 March 2010, 8:58
    • Genialne i w ogóle fajna stronka!!! ale jakbyś rozszerzył jeszcze kwestie socketów, żeby serwer obsługiwał i rozróżniał kilku klientów, wysyłał odpowiedź do właściwego wtedy byłoby super Cool. Pozdro.
    • zbynio_k
    • Wed, 24 February 2010, 10:53
    • genialne, najprostsze wprowadzenie
      w temat
      dzięki

      P.S.
      nawet na 4programmers nie znalazłem takiego, tam ZACZYNAJĄ od przesylu pliku a trzeba zrozumieć zasadę:)
    • HotSauce
    • Sun, 22 March 2009, 13:49
    • tronka jest suuper bardzo duzo sie z niej nauczyłem
      na socketach trojanki nie dzialaja za NATem... :< wiec w sumie są bez uzyteczne . Moze zrobisz artykul na program klient serwer oparty na komponentach INDY ? przydało by sie.


      pozdrawiam
    • Adik0160
    • Tue, 23 September 2008, 20:37
    • super i łatwe pozdro ;D
    • Bathman
    • Sun, 8 June 2008, 23:31
    • Dzięki za odpowiedź. No więc bawie sie troche w to. Raczej napewno (przynajmniej avast) wykryje server jeśli będą w nim "linijki" które mają dopisać coś do rejestru. :P.
    • Bathman
    • Sat, 7 June 2008, 14:37
    • często już po kompilacji antyvir wywala komunikat o trojanie, da sie coś z tym zrobić?
    • Wirus
    • Fri, 29 February 2008, 19:44
    • super! dzięki za pomoc!
Dexter