Komunikator - gadanie między klientami

0

Witajcie!
Jestem w trakcie pisania komunikatora. Jest sobie serwerek, który przesyła informacje pomiędzy klientami. Problem tkwi w tym, jak zrobić coś takiego, żeby serwer wysyłał dane dokładnie do tego klienta, do którego chcemy, lub też (jeśli tego sobie zażyczymy) dowszystkich naraz.
Programiki opierają się na gniazdkach ServerSocket i ClientSocket.
Z góry dzięki za odpowiedź!

0

Przesyłaj rekord i w nim jedna zmienna z numerem odbiorcy do serwera, on by to odbierał i wysyłał dalej do określonego odbiorcy.
<font color="blue">[dopisane]
Po czym chcesz może być IP albo rozmiar buta, zależy od ciebie.</span>

0

Tak teżmyślę zrobić, tylko nie wiem jaka funkcja(metoda) umożliwi mi coś takiego. Po czym mam rozpoznawać klientów, po IP?

Próbowałem czegoś takiego: ServerSock.Socket.Connections[cośtam].SendText(Socket.ReceiveText);, tylko nie wiem co wrzucić do tego "cośtam".

0
truchelek napisał(a)

Tak teżmyślę zrobić, tylko nie wiem jaka funkcja(metoda) umożliwi mi coś takiego. Po czym mam rozpoznawać klientów, po IP?

Próbowałem czegoś takiego: ServerSock.Socket.Connections[cośtam].SendText(Socket.ReceiveText);, tylko nie wiem co wrzucić do tego "cośtam".

liczbę od 0 do ActiveConnections

0

nie polecam robic komunikatora socketem, bo sam taki zrobilem i na moim kompie dziala, a u kolegow nie. przez internet to inaczej dziala niz jak na jednym kompie masz klienta i serwer

i jeszcze pytanie. czy zrobiles juz zeby serwer nie wysylal bledow np bo klient sie wylaczyl? jak tak to pokaz prosze.

0

Do tego jeszcze nie doszedłem. Stanąłem na etapie komunikacji między klientami, bo klient zserwerem już gada (ale tylko pierwszy).

A jakie komponenty proponujesz?

Aha to ma być komunikator tylko na sieć lokalną (praca na studia).

0

szczerze mowiac tez jestem poczatkujacy w tej materii ale sockety mnie rozczarowaly. po prostu nie dziala to jak powinno. no ale w lokalnej to moze rzeczywiście to bedzie dzialac bo jak probuje na 1 komputerze, to wszystko jest jak trzeba.

0

czego wyście sie uczepili tak tych socketów, po prostu nie umiecie jesteście zieloni i chcielibyście jakieś super hiper komponenty których obsługa sprowadza sie do connect , sendtext , sendfile ha ha ha to ma być programowanie ? Jak już nie umiecie samemu nic znaleŹć to przynajmniej zadajcie mądrze pytanie.
Do programów sieciowych uzywam tylko socketów a nie tego syfu INDY wszystko można napisać tylko potrzeba troche wiecej czasu. Im niżej zejdziemy tym wiekszą mamy kontrole i obsługe błędów.
Nie wiem jak to wygląda w INDY bo wiekszość komponentów lub programów ma problemy gdy rozłączy się internet lub jakiś inny błąd, wyskakuje wtedy jakis niechciany komunikat, na socketach w zdarzeniu Error wystarczy wpisać ErrorCode:=0; i to załatwia obsługe podstawowych błędów. Dalej mozna wykonać jakąś procedurke, która może sparwdzić numer błędu i wykonać odpowiednie działanie.
A co do tego co masz wpisać w "coś tam" to wpisujesz numer połączenia czli możesz np gości połączonych dodawać do listbox i teraz jak zaznaczysz kogoś to wspisujesz server.socket.connection[listbox.itemindex].sendtext wyślesz wiadomość tylko do tego którego zaznaczyłeś.
Wiekszość z was zaczyna od pisania przesyłania plików a nie ma w ogóle pojecia o podstawach. Zresztą co mnie to ...

0

Stefik na soketach da się wszystko jak napisał Spawacz.
Co do identyfikacji to albo po IP albo generuj przy pierwszym starcie programu GUID i po nim identyfikuj klientów, albo jak to robi gg serwer generuje nr, który jeszcze nie jest przypisany do klienta i wysyła go nowemu klientowi

0

Identyfikacja po IP? To przeca totalny nonsens! Wystarczy, że za natem albo na jednym kompie będzie dwóch userów i wszystko się wali... Jedyne rozsądne rozwiązanie to dynamiczna lista/tablica podłączonych userów.
A jeśli chodzi o Sockety, to pisałem sporo programów sieciowych, wszystkie opierały się o czyste Sockety i wszystko pięknie działa.

0
Adam.Pilorz napisał(a)

Identyfikacja po IP? To przeca totalny nonsens! Wystarczy, że za natem albo na jednym kompie będzie dwóch userów i wszystko się wali...

tyż fakt ale jeśli z jednego IP będzie więcej niż 1 user

Jedyne rozsądne rozwiązanie to dynamiczna lista/tablica podłączonych userów.

a jak nagle klient się rozłączy a inny wyśle do niego text to ten text zamiast zostać gdzieś zapamietany i przesłany po podłączeniu zostanie utracony. Dlaczego tak zaciekle bronisz się przed stałymi identyfikatorami dla klientów??

0

fajnie słuchasz na tych studiach, że twoja praca skończyła sie zanim sie jeszcze dobrze nie zaczeła. Mówisz że to ma działać tylko po lanie, więc z czym problem. Nazwy komputerów sie raczej nie zmienią. więc możesz sie łączyć po Hostach. Nazywasz swój komputer "Serwer". Wszyscy klienci będą się łączyli z hostem "Serwer" a u ciebie będzie to wyglądało tak:

Pc 1 192.168.0.1
Pc 2 192.168.0.2
Pc 3 192.168.0.3
Pc 4 192.168.0.4

więc kiedy chcesz wysłać wiadomość do pierwszego ServerSocket.Socket.Connection[ wynosi 0 ] do drugiego 1 do trzeciego 2 itd.
Jesli teraz ktoś się rozłanczy usuwasz go tylko z listy na serwerze np w ListBox tak jak ci juz napisałem. Na twoim miejscu napisał bym raczej rozmowe głosową niż taki badziew to żadna filozofia. Powiedział bym ci jak napisać rozmowe głosową na tych głupich daremnych socketach, ale to ty jesteś studentem, więc się męcz :)

0

spawacz: Ale znowu herezje głosisz! Przecież w ten sposób ograniczasz liczbę klientów pod jednym adresem IP do liczby 1! A co jeśli ja chcę na tym samym komputerze odpalić dwa klienty? Co jeśli jakiś komputer będzie routerem dla drugiej "wewnętrznej" sieci? Bo jeśli uważasz to za niemożliwe (Internet <-> Router <-> Router <-> Klient), to się mylisz, bo takie rzeczy są jak najbardziej stosowane.

Misiekd: A kto broni zrobić coś takiego, że serwer zapamiętuje tekst, który wysłał, po czym dopiero po otrzymaniu potwierdzenia dostarczenia od klienta ten tekst usuwa? Mam na myśli dynamiczną listę łączącą numery klientów (identyfikatory użytkowników czy coś takiego) z numerami połączeń w ServerSocket. Nie bardzo sobie wyobrażam zorganizowanie tego inaczej.

0

Adam myślałem, że chcesz dynamicznie generować właśnie id dla klienta przy podłączeniu, co nie miało by sensu bo wtedy klijent jest unikalny tylko w ramach połączenia

0

Nie jestem takim fachowcem od sieci jak wy, a może cie jakoś nie do końca zrozumiałem ale skoro mój sposób ogranicza do 1 klienta to wtakim razie jesli zrobie coś takiego jak GG czyli będe zakładał konta i:

podłączy się 192.168.0.1 założył sobie konto numer 1
podłączy się 192.168.0.1 założył sobie konto numer 2

czyli z 1 ip masz dwóch gości i rozróżniasz ich tylko po numerze konta to jak wyślesz wiadomość do tego co chcesz ?
Małe sprostowanie co do mojego sposobu, nie mam żadnej sieci, ale według ciebie to chyba wygląda tak że jak bym u siebie uruchomił serwer i 2 klientów to jak bym wysłał wiadomość do jednego to drugi też powinnien ją dostać ? czy może sie myle ?

0
spawacz000 napisał(a)

Nie jestem takim fachowcem od sieci jak wy, a może cie jakoś nie do końca zrozumiałem ale skoro mój sposób ogranicza do 1 klienta to wtakim razie jesli zrobie coś takiego jak GG czyli będe zakładał konta i:

podłączy się 192.168.0.1 założył sobie konto numer 1
podłączy się 192.168.0.1 założył sobie konto numer 2

czyli z 1 ip masz dwóch gości i rozróżniasz ich tylko po numerze konta to jak wyślesz wiadomość do tego co chcesz ?
Małe sprostowanie co do mojego sposobu, nie mam żadnej sieci, ale według ciebie to chyba wygląda tak że jak bym u siebie uruchomił serwer i 2 klientów to jak bym wysłał wiadomość do jednego to drugi też powinnien ją dostać ? czy może sie myle ?

nie wiem, do kogo jest to pytanie ale odpowiem. Jeśli będziesz ich identyfikował po IP to jeśli na jednym IP uruchomisz dwóch klientów to obaj dostaną ta wiadomość albo zawsze będzie dostawał ten, który jest pierwszy na liście. Co do rozróżniania jak gg to aby klient mógł coś wysłać lub odebrac musi się najpierw połączyć z serwerem i zalogować. Wtedy połączenie masz już nawiązane i serwer nie musi "szukać" odpowiedniego klienta w sieci bo go już ma. Zauważ, że jeśli klient podłączy się do serwera (mam cały czas na myśli serwer wielowątkowy z niezależną obsługą każdego połączenia) to dostaje osobny wątek do jego obsługi. Wystarczy teraz do każdego wątku przypisac unikalny ID klienta i serwer nie szuka po IP, nie wysyła do klienta pytania "kto ty jesteś" za każdym razem jak ma wysłac komus wiadomość tylko sprawdza, który wątek obsługuje dane klienta i przekazuje do tego wątku wiadomość a wątek wysyła ją już do klienta. Ja tak to widzę i jest to chyba najprostsze rozwiązanie. Tak samo w momencie zakończenia połączenia wątek wysyła komunikat do serwera, że koniec i się zamyka

0

Czyli z tego wynika, że to co napisałem wyżej nie powinno działać bo nie rozróżnimy kliku połączeń z tego samego IP tak ? więc ten przykład też nie powinnien działać... Demo
Jesli się myliłem to zwracam honor

0

no niby pięknie łądnie ale z założenia serwer to nie klient i trochę inne jest jego zadanie. A jak jeden klient chce sobie porozmawiać z drugim to co wtedy?? Zobacz, że serwer (w tym wypadku) nie musi szukać odpowiedniego połączenia do klienta bo jest ono wybierane z listy. Ale jeśli chciałbyś przesłać wiadomość z jednego klienta do drugiego to jak go wtedy zidentyfikujesz jak będziesz miał dwa o takim samym identyfikatorze (to samo IP)?

0

ej ja tu nie napisałem funkcjonalnego komunikatora tylko przykład że da sie wysłać wiadomość do różnych kolesi z tego samego IP. Zawsze może sie pokusić o napisanie serwera podobnego do serwera GG.
Czyli będzie wysyłał odpowiednie pakiety do serwera a serwer dalej.

0
spawacz000 napisał(a)

ej ja tu nie napisałem funkcjonalnego komunikatora tylko przykład że da sie wysłać wiadomość do różnych kolesi z tego samego IP. Zawsze może sie pokusić o napisanie serwera podobnego do serwera GG.
Czyli będzie wysyłał odpowiednie pakiety do serwera a serwer dalej.

ale zrozum, że to co Ty dałeś i o czym mówisz to całkiem co innego niż to o co chodzi pytaczowi.

" Jest sobie serwerek, który przesyła informacje pomiędzy klientami. Problem tkwi w tym, jak zrobić coś takiego, żeby serwer wysyłał dane dokładnie do tego klienta, do którego chcemy"

0

spawacz000 napisał:

czego wyście sie uczepili tak tych socketów, po prostu nie umiecie jesteście zieloni i chcielibyście jakieś super hiper komponenty których obsługa sprowadza sie do connect , sendtext , sendfile ha ha ha to ma być programowanie ? Jak już nie umiecie samemu nic znaleŹć to przynajmniej zadajcie mądrze pytanie.

otóż nie jestem programistą a prrogramowanie traktuje jako hobby. może i głupie pytania zadaje ale przynajmniej nie robie bledow stylistycznych i jezykowych. poza tym takim postem nikomu nie pomożesz!

0

to ja przy okazji zadam pytanie co do socketów ? co zrobić żeby wszystko się przesyłało ? bo robiłem tak że wysyłało plik buforami i małe bufory przesyłało idealnie ale bardzo wolno, żeby zwiększyć prędkość to zwiększałem bufor aż w końcu okazało się że nie dochodziły całe części buforu a prędkość dalej nie była zachwycająca, to jak zrobić tak jak otoczenie sieciowe że wysyła u mnie w sieci jakoś od 1 - 30 MB/s zdaje się bo w moim programie kiedyś co pisałem na socketach (dawno już się za nie nie brałem może robiłem jakiś głupi błąd) to maksymalna prędkość była jakaś 300 KB/s :/ powyżej tej wartości niestety dochodziły co n-te bajty i plik zajmował np 2/3 tego co powinien nie dając się uruchomić lub w przypadku np mp3 dźwięki przeskakiwały

0

bo ten post nie miał nikomu pomóc a co do umiejętności programowania to nie miałem ciebie konkretnie na myśli ja też pisze tylko dla frajdy.
Jeśli zrobi sobie coś na podobieństwo GG czyli bedzie miał konta wysyła pakiet z wiadomością i numerem konta. Serwer odbiera to i sprawdza czy taki numer się podłączył(zalogował) jeśli tak to pobiera jego index z listy i wysyła do niego ta wiadomość. Mogą być wszyscy z tego samego IP ale na liście są w pewnej kolejności i wie że numer konta 673254365 połączył się jako 3 więc na liście jest jako [2]. Tylko mi teraz nie pisz że skąd serwer bedzie wiedział że numer 673254365 połączył się jako 3.

Co do błędów no curz nikt nie jest super

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