Komponenty ClientSocket i ServerSocket

0

Witajcie
A wiec od poczatku :). Próbuje zrobić prosty komunikator bo nie mam lepszego pomysłu na program typu klient-serwer... Tyle ze widziałbym to wszystko w jednym programie i zastanawiam się czy można do jednej aplikacji wrzucic oba komponenty??I tylko chyba oba nie moga być naraz aktywne?? Pomocy... Z góry dzięki... Pozdrowienia!!

0

Skoro nawet nie chciałoci się sprawdzić, to po co zadajesz takie głupie pytanie i zaśmiecasz forum? Wstaw elementy na jeden formularz i uruchom. Jak ci zadziała to znaczy że można, jak wywali error - to wtedy jest sens pytać.
A odpowiedź brzmi TAK, MOŻNA.

0

Skoro nawet nie chciałoci się sprawdzić, to po co zadajesz takie głupie pytanie i zaśmiecasz forum? Wstaw elementy na jeden formularz i uruchom. Jak ci zadziała to znaczy że można, jak wywali error - to wtedy jest sens pytać.
A odpowiedź brzmi TAK, MOŻNA.

Fakt może dobrze tego nie ująłem ale uwierz mi że sobie to odpaliłem i niestety razem aktywne nie mogą być, może źle coś robię - przeca się uczę. A ty co <ort>Od razu</ort> się wszystkiego nauczyłeś nie zadawając głupich pytań!!?? <ort>Od razu</ort> trzeba krytykować....

0

Skoro próbowałeś i nie wyszło to w porządku - po prostu z twojego postu za cholerę to nie wynikało ;) . A ja nie krytykuję tego że pytasz - od tego jest forum - tylko to że - jak wynikało z twojego postu - nawet nie próbowałeś tego odpalić. Skoro próbowałeś to pytanie powinno brzmieć 'jak wrzucić do jednej aplikacji oba komponenty' a nie 'zastanawiam się czy można wrzucić...'. Tak można odnieść mylne wrażenie.

Ale wracając do tematu - skoro próbowałeś i nie wyszło to pewnie coś robisz nie tak, bo u mnie działa, więc zrób następująo:
-wstaw ClientSocket i ServerSocket
-ustaw w obydwu komponentach ten sam port (np.1040)
-w ClientSocket wpisz adres serwera (ADDRESS) 127.0.0.1
-ustaw w obydwu komponentach ACTIVE na TRUE

i już działa.
Wysyłasz zapytanie dla klienta: ClientSocket1->Socket->SendText("ALA");
a dla serwera: ServerSocket1->Socket->Connections[0]->SendText("ALA");
Odpowiedź w zdarzeniach onRead lub onClientRead, odpowiednio Socket->ReceiveText() i Socket->ReceiveText()

0

kurcze ale ze mnie tępy buc.... Jak mozesz to napisz cos jeszcze, bo jesli miało to by być po sieci to host musiałby byc inny dobrze kojarze?? I will back :( Dzieki i Pozdrawiam

0

Tak, w HOST podajesz adres IP kompa na którym jest uruchamiony dany ServerSocket. Po zmianie ACTIVE klienta na TRUE łączy się on do serwera pod podanym adresem IP. Adres IP najlepiej sprawdzić np. na stronie www.bt-com.com/ip . Jeśli to ma być komunikator sieciowy to albo jeden program zawiera tylko serwer - wszyscy klienci łączą się do niego, a chcąc się komunikować między sobą przesyłają dane do serwera wraz z informacją do którego klienta ta informacja ma trafić, a serwer przesyła ją do odbiorcy.
Wygląda to mniej więcej tak: chcąc przesłać wiadomość Klient1--->Klient2 i z powrotem trzeba to zrobić tak:
Klient1---->Serwer---->Klient2;
Klient1<----Serwer<----Klient2
Oczywiście taki serwer musi być cały czas uruchomiony i pod stałym adresem IP (tak chyba działa Gadu-Gadu, nie jestem pewien). Do serwera można podłączyć wielu klientów, ale to chyba wiadomo :)
Za to jeden klient może mieć połączenie tylko z jednym serwerem - cały czas mowa o komponentach ServerSocket i ClientSocket. Serwer komunikuje się z "podpiętymi" klientami przez tablicę CONNECTIONS: np. ServerSocket1->Socket->Connections[0]->SendText("ALA") powoduje wysłanie do klienta zapisanego w tablicy pod pozycją 0. Jeśli chcesz coś wysłać do innego klienta, zamiast 0 musisz wstawić inny numer.
Pamiętaj że to klient inicjuje połączenie do serwera - nigdy odwrotnie. Dlatego jeżeli chciałbyś napisać komunikator bez "centralnego" serwera, tj. taki gdzie klienci łączą się bezpośrednio między sobą: Klient1<---->Klient2, każdy taki komunikator musiałby zawierać zarówno ServerSocket jak i ClientSocket. Tak chyba z kolei działają programy peer-to-peer (p2p).
Najpierw należało by rozpoznać czy jest już uruchomiony przynajmniej jeden program w sieci. Nie pytaj mnie jak to zrobić :D bo nie wiem - chyba było już kiedyś na forum. Jeżeli jest, to klient nowouruchamianego programu łączy się do serwera tego już uruchomionego. Tu też się przyznaję że nie wiem jak by to dalej miało być - ładnie wygląda jak rozmawiają ze sobą tylko dwie osoby - wtedy jedna robi za serwer a druga za klienta [przypomina mi się kawał o więźniach w którym jeden robi za tatusia a drugi za mamusię, ale nie będę go tu przytaczał ;P ]. Jeżeli miałaby się podpiąć kolejna osoba, to do serwera. A dalej jak w przypadku z serwerem.
Dobra, nie będę dalej mieszał ;P
Jakbyś miał jeszcze jakieś konkretniejsze pytania spróbuję pomóc.
Pozdrawiam!

0

Jeśli kompilujesz w Builderze to zajrzyj do siebie do:
C:\Nie wiem gdzie masz zainstalowanego Buildera\Examples\Internet\Chat

Jest tam przykładowy chat z klientem i serwerem razem na jednej formatce.
Może Ci się przyda.

Pozdrowienia

0

To juz cos - dzieki.
Ale jak zrobic liste aktywnych uzytkowników, <ort>w ogóle</ort> jak pobrac hosty albo IP?? Jeśli się komuś coś nasunie to bede wdzieczny. Dzieki i Pozdrowienia

0

Taki kawałek kodu:

ServerSocket1->Socket->Connections[ActiveConnactions-1]->RemoteAddress

wstawiony do zdarzenia onClientConect Serwera daje adres IP klienta który się właśnie podłączył (ActiveConnections to parametr okreslający liczbę aktualnie podpiętych do serwera klientów. Nowy klient jest zawsze dołączany na koniec, dlatego można się tak odwoływać jak w przykładzie. Po rozłączeniu jednego z klientów, np. nr 5 wszyscy klienci dostępni na połączeniach >5 są przesuwani o 1 oczko w dół aby zapełnić powstałą dziurę. I tak np. klient dostepny na Connections[7] będzie dostępny na Connections[6] etc.). W tym samym zdarzeniu można wstawić taką linijkę:

Socket->SocketHandle

,
która zwraca uchwyt dla podłączanego klienta - ten uchwyt to liczba czterocyfrowa, np.1421. Każdy klient dostaje inny uchwyt po którrym można go zidentyfikować, nawet jeżeli dwóch klientów ma takie samo IP. Polecenie

Socket->Handle 

można też podpiąć do onClientDisconnect aby zidentyfikować który klient się odłączył. Dalej musisz sam pokombinować - najlepiej utworzyć tablicę lub listę w której trzymasz zależności pomiędzy uchwytem do klienta, jego pozycją w tablicy Connections[...] serwera i jego adresem IP.

0

Dzieki marcinj. Wiem ze musze sam kombinowac ale jak <ort>na razie</ort> idzie bardzo opornie... Jak by kto miał jakies arty, kody abym to lepiej zrozumiał bede jak zawsze bardzo wdzieczny. Pozdrawiam

0

Klient1---->Serwer---->Klient2;
Klient1<----Serwer<----Klient2

Tak to prawda, ale jak (Klient1---->Serwer---->Klient2;) Klient2 uzyska wiadomość od serwera, przecież musi w tym momencie nasłuchiwać. A jeśli musi nasłuchiwać, to Klient musi być serwerem. Nie wiem czy dobrze rozumiem.

0

Klient1---->Serwer---->Klient2;
Klient1<----Serwer<----Klient2

Tak to prawda, ale jak (Klient1---->Serwer---->Klient2;) Klient2 uzyska wiadomość od serwera, przecież musi w tym momencie nasłuchiwać. A jeśli musi nasłuchiwać, to Klient musi być serwerem. Nie wiem czy dobrze rozumiem.

Tak chyba tak to działa, tyle że ja chce [chciałbym] zrobic klient1<->klient2. Ale tez cos w tym stylu chyba bedzie ze musi nasluchiwac i musi odbierac wiadomosci i raczej na jenym porcie to chyba nie pojdzie... Pozdrawiam

0

Tak to prawda, ale jak (Klient1---->Serwer---->Klient2;) Klient2 uzyska wiadomość od serwera, przecież musi w tym momencie nasłuchiwać. A jeśli musi nasłuchiwać, to Klient musi być serwerem. Nie wiem czy dobrze rozumiem.

Otóż nie - serwer po prostu wysyła klientowi wiadomość. Załóżmy że jest 2 klientów połączonych z serwerem: serwer wysyła tekst do klient1 tak:

ServerSocket1->Socket->Connections[0]->SendText("Wiadomość dla klienta1");

a do klienta 2 tak:

ServerSocket1->Socket->Connections[1]->SendText("Wiadomość dla klienta2");

Nasłuchiwaniem, że się tak wyrażę, 'zajmuje się' komponent ClientSocket - kiedy dostanie wiadomość od serwera przejdzie do obsługi zdarzenia onRead.

0

Hmm opisałeś tu połączenie serwera z 2-oma klientami, a w przypadku samych dwóch klientów jest tak samo??? [sciana] :| [???]

0

Hmm opisałeś tu połączenie serwera z 2-oma klientami, a w przypadku samych dwóch klientów jest tak samo??? [sciana] :| [???]

Co to znaczy 'tak samo'? ClientSocket nie może się bezpośrednio łączyć z innym ClientSocket. Musi się łączyć do komponentu SeverSocket.
Jeżeli chcesz zrobić komunikator bez centralnego serwera (czy ja się powtarzam?) to na formatce komunikatora musisz umieścić OBA komponenty, i wtedy ClientSocket klienta nr 1 łączy się do ServerSocket klienta nr 2 celem nawiązania połączenia.

0

Nie nie wcale się nie powtarzasz ale czasem to pomaga ;) . Teraz tylko to zrobic ;) . A jeszcze co moze przyczyna takiego błędu: "Windows Socket error: Tylko jedno użycie każdego adresu gniazda (protokół/adres sieciowy/port) jest normalnie dozwolone (10048), on API "bind""????

0

Nie nie wcale się nie powtarzasz ale czasem to pomaga ;) . Teraz tylko to zrobic ;) . A jeszcze co moze przyczyna takiego błędu: "Windows Socket error: Tylko jedno użycie każdego adresu gniazda (protokół/adres sieciowy/port) jest normalnie dozwolone (10048), on API "bind""????

Dla ewentualnych zainteresowanych :)
Problemem było używanie portu 1025 który był już w użyciu przez inną aplikację.

0

I w kilku innych ;) Dobra to chyba koniec tego tematu... Pozdrawaim wszystkich i Dzieki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1