Avatar
mnauik
Člen
Avatar
mnauik:

Ahoj, pracuji na semestralce, kterou mam ve ctvrtek odevzdat. Chtel jsem se zeptat, jakym zpusobem mam vyresit spojeni serveru s clientem, kdyz musi byt v aplikaci chatovaci mistnosti, kazdy uzivatel musi mit svuj profil, musi fungovat historie soukromeho chatu mezi uzivateli. Nejde mi o to, aby mi nekdo napsal kod, to dovedu sam, spis jak to udelat, abych se vyhnul predavani mnoha parametru a redundantnimu kodu.

Jak jsem to resil ja:
Server ceka na socket klienta, klient se pokusi pripojit k serveru, server to prijme a vytvori serverove vlakno ServerThread, v ServerThreadu mam streamy - vstupni i vystupni. Klient tedy posila stringy ServerThreadu, prvni String obsahuje to, co chce klient provest (prihlaseni, registrace, konec spojeni), ktere resim switchem (pokud je lepsi moznost, tak prosim o napsani postupu, ale nechci kod :) ) a dalsi stringy informace - jmeno, heslo, atd.

Jenze jsem ted narazil na problem, netusim, jak vytvorit chatovaci mistnost, protoze chatovaci mistnost obsahuje vice uzivatelu, takze me napadlo vytvorit dalsi chatovaci vlakna s tim, ze ServerThread prerusim a funkci predam chatovacimu vlaknu, pak ale musim chatovaci mistnosti dat arraylist tech chatovacich vlaken? Nebo uzivatelu? Nebo oboji?

Dekuji moc za odpoved, omlouvam se dlouhy popis problemu, ale nechtel jsem, abyste si mysleli, ze jsem dalsi nekdo, kdo chce udelat ukol do skoly a doufa, ze mu ho tady nekdo udela. Chci jen nasmerovat a poradit se s lidmi, kteri s programovanim maji vetsi zkusenosti nez ja.

edit: jeste jsem se zapomnel zeptat na reseni historie zprav mezi dvema uzivateli, nebudu prispevek zbytecne protahovat - ma vytvorit objekt, ktery bude reprezentovat dvojici uzivatelu nebo tu historii vlozit kazdemu uzivateli rovnou?

Editováno 11.5.2014 16:44
Odpovědět 11.5.2014 16:42
minusuj mě, ale zdůvodni to ;)
Avatar
Odpovídá na mnauik
Luboš Běhounek (Satik):

Vlakna bych tam zatim zbytecne netahal.

Chatovaci mistnost by jsi mel mit jako tridu, ktera si bude pamatovat vsechny uzivatele, co v ni jsou - pri pripojeni ji predas toho uzivatele, ktery by ten stream mel mit idealne u sebe (taky by mel byt jako trida).
A odebrat ho samozrejme z mistnosti, kdyz se odpoji :).

Pri posilani zpravy uzivatelem pak musis posilat, do jake mistnosti chatuje a na serveru se pri zpracovani te zpravy podivat, kdo vsechno v te mistnosti je a vsem tem lidem tu zpravu rozposlat.

Chat dvou lidi pak muze byt jako chat v mistnosti s nejakym genericky vygenerovanym nazvem, ktery se ani nemusi zobrazovat.

Switch je v tomhle pripade asi nejlepsi volba, jen bych misto stringu posilal cislo typu zpravy binarne jako cele cislo.

Nahoru Odpovědět  +1 11.5.2014 16:59
:)
Avatar
mnauik
Člen
Avatar
Odpovídá na Luboš Běhounek (Satik)
mnauik:

Dekuji za odpoved. Nedovedu si predstavit, jak do toho netahat vlakna. Na strane clienta mam vlakna dve, jedno je prijimaci, druhy odesilaci. Kdybych u serveru zredukoval pocet vlaken na 2 (pouze s jednim jednim vlaknem si to nedovedu vubec predstavit) - vlakno, ktere prijima nove sockety a vlakno, ktere provadi urcite operace, tak nevim, jak s jednim vlaknem odchytit napr. zpravu klienta 1 do mistnosti 1 a zaroven potvrdit registraci klienta 2, navic, co jsem pochopil, tak kdyz vlakno ceka na vstup ze socketu, tak se pozastavi.

Nahoru Odpovědět 11.5.2014 20:01
minusuj mě, ale zdůvodni to ;)
Avatar
Odpovídá na mnauik
Luboš Běhounek (Satik):

Na klientovi i na serveru ti staci 1 vlakno pro zapis i cteni i pro prijmuti novych pripojeni, neni duvod mit vlaken vic (pokud pouzivas TcpListener a TcpClient).

Nahoru Odpovědět 11.5.2014 20:44
:)
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na mnauik
Silvinios:

Vláknům se vyhnout lze, pokud použiješ neblokovací sokety (non-blocking socket).

 
Nahoru Odpovědět 12.5.2014 20:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.