c# Serwer, określenie ID

0

Witam mam problem.. Dałem kumplowi klienta, który ma łączyć się z serverem... Z klientem jest wszystko OK, ale server coś nie tak.. Chcę przy każdym połączeniu chce określić ID połączenia, tzn. przychodzi pierwsze połączenie to pisze: Nadeszło połączenie ID: jakieś tam, i tak po kolei aż do max 10 połączeń(mam tak w pętli) ... Napisałem kod ale pokazuje tylko te pierwsze połączenie (w consoli). Reszta połączen niechce pokazać się w consoli, o to kod:

        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(5050);
            listener.Start();
            Console.WriteLine("Serwer został włączony");
            int clientnumber = -1;
            int x;
            for(x=0;x<10;x++)
            {
                TcpClient klient = listener.AcceptTcpClient();
                clientnumber += 1;
                Console.WriteLine("Nadchodzi polaczenie, ID: " + clientnumber);
                Console.ReadLine();
            }
        }

Pomóżcie, bo juz sam nie wiem jak zrobić, że przy każdym polaczeniu z serverem pisalo ID(w kolejnosci od 0 do 10)

0

a moze po prostu wyświetlać wartość spod zmiennej x ??

0

Console.ReadLine();
wywal to :P

1

Jeśli ten serwer ma działać cały czas, to z tego co pamiętam wystarczy Application.Run() - nie wyłączy się. Spróbuj.

0

Application.Run() to petla komunikatow aplikacji okienkowej...

0

no to jak mam zrobić:/ ?

a jak zrobić, żeby consola nie znikała, bo tylko .readline pomaga.

Edit: użyłem wartość z petli i nadal to samo, pokazuje tylko pierwsze polaczenie, reszte nie :/

0

dark_astray przeciez dal Ci odpowiedz.

//edit
Daj to po petli. Teraz musisz cos wciskac po kazdym polaczeniu.

0

ahhh dzieki:) to przez te readline xD

Edit: A jak mogę wyrzucić klienta (serverem), albo sam klient sie odłącza od servera?

0

w ten sposób jak robisz to teraz, będziesz miał możliwość komunikacji tylko z jednym ostatnim klientem, może zrób tablicę TcpClient.
Nie wiem czy fachowo tak powinno się to załatwiać, ale wiem na pewno że tak będzie to działać i będziesz mogł wysyłać w zależności od potrzeb, informacje i do pierwszego i do ostatnio połączonego.
Niech ktoś mnie poprawi jak jestem w błędzie.

0

Zwykle robi sie dedykowana klase do obslugi konkretnego polaczenia, ktora odpala sie w osobnym watku czy tez obsluguje w puli.

Czyli cos w stylu

while(serverWorks)
{
   TcpClient klient = listener.AcceptTcpClient();
   new ClientCommunication(klient).StartThread(); //np. odpalamy nowy watek, gdzie klient sobie rozmawia z serwerem
}
0

ahh też tak myślałem o wątku. Ale ten servWorks od czego zacząć ?? new servWorks = czegos tam sie rowna, sory niewiem do końca xD i wtedy zacząc petle while ?

0

No nie, serverWorks to zmienna logiczna oznaczajaca czy serwer pracuje. Jakos go kiedys konczysz, nie? :P Na dzien dobry serverWorks = true, a kiedys ja przestawiasz programowo, jak chcesz zakonczyc prace. To ogolne pojecie, na poczatek moze byc while(true), jesli to tylko cwiczeniowy programik.

0

o dzieki, ale po co do tego bool jesli sie wylacza program to automatycznie sie server wylacza no nie ?

edit: hmm zrobiłem cos takiego: Thread communication = new Thread(new ThreadStart(klient));

ale error pokazuje sie taki: 'klient' is variable but is used like 'method' hmmm co tu zrobic ; /

0

Jak wolisz metode brutalna, to ok :P Zwykle program wylacza sie sam, a nie robi sie tego zmuszajac go to tego.

0

Bo parametr jaki przekazujesz do ThreadStart ma być metodą, a Ty chcesz uruchomoć wątek dla obiektu, i co się z nim ma dziać? :)

0

to pomóż ja nie dawno zaczełem intesywna nauke c#. Ucze sie w praktyce.. Więc co mam zrobic z tym wątkiem ?

0

Zaczynaj więc może od prostszych rzeczy.

Jeśli chcesz zrobić tak jak wcześniej napisał Johny

 new ClientCommunication(klient).StartThread();

to on tutaj ma klase o nazwie ClientCommunication gdzie przekazywanym parametrem jest klient. A tenże obiekt (typu ClientCommunication) ma jeszcze taka metode jak StartThread();

to nie jest to samo co:
Thread communication = new Thread(new ThreadStart(klient));

wracając do Twojego problemu:
new Thread(new ThreadStart(COS));

COS w tym przypadku ma być jakąś metodą, np pobierajaca,wysylajaca dane, czy przetwarzającą (CommandProcessor)

0

@up: of coz, moj kod to skrot myslowy, masz pelna racje, poprawna interpretacja moich intencji :) Sadzilem, ze autor sie domysli.

0

to ja już niewiem, gdzie mam uzyc te clientcommunication ;/

0

Tak jak w przykladzie. Tylko najpierw musisz sobie taka klase stworzyc i w niej zdefiniowac co sie dzieje po polaczeniu z klientem. Co chcesz w ogole napisac?

0

ja ogólnie wiem o co chodzi, ale nie wiem jak zrobic w private, public, void czy w czyms innym jeszcze??

0

Ale ze co? Kojarzysz w ogole OOP czy zaczales 'programowac' wczoraj?

0

jak zrobic w private, public, void czy w czyms innym jeszcze??

Naprawdę zacznij od prostszych rzeczy, pisanie aplikacji sieciowych do podstaw raczej nie należy. Braki w podstawach później wychodzą.

A jeżeli już tak chcesz to google, Pomoc w problemie owszem, ale my tutaj uczyć Cię nie będziemy.

google -> c# tcp -> pierwszy link
Pozdr :)

0

o to mi chodzil, dzienx

0

hej, ale co tu zrobić, bo jak to usuwam:

        
static void Main(string[] args)
{
}

i errory wyskakuja, a tak w ogóle bez tego consola nie funkcjonuje wiec co tu zrobic?


sory, zagapilem sie.. nie dalem edit
0

A co chcesz osiagnac przez usuniecie Maina?

0

no bo jak "Startuje" wątek w main'nie to zaraz errory sie pokazuja... np. "An Object reference is required for the nonstatic field, method or property 'serv.Program.sasf" sasf- nowy wątek. No i co ja mam z tym zrobić ; /

0

Zabrac sie za prostszy temat. Nie umiesz programowac i nie znasz tego jezyka i rzucanie sie na wielowatkowe sieciowe aplikacje to strzal w plecy z luku. Serio.

0

Z tym usuwaniem maina to tak jakby ktoś skarżył się na ból palca u stopy i uciąć mu głowę.

0

dostanę pomoc czy będziecie jęczyć?

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