Filozofie komunikace klient - server – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Filozofie komunikace klient - server – .NET – Fórum – Programujte.comFilozofie komunikace klient - server – .NET – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

Kubas1290
Stálý člen
8. 8. 2021   #1
-
0
-

Potřeboval bych další radu :-))

Co méně vytěžuje procesor? A taky, která z těchto dvou metod se používá v praxi (např. ve hrách)?

Mám klienta, ve kterém potřebuji aktualizovávat ze serveru list místnosti do, kterých se můžou  následně připojovat.  A napadají mě dva způsoby jak aktualizovávat ten list a nevím který z nich je ten lepší.

1) Způsob, který i ted používám je, že každou vteřinu požádám server, aby mi poslal jeho aktuální list místností. Což u tohoto způsobu se mi zdá, že dost zbytečně vytěžuji server vzhledem k tomu, že je velmi pravděpodobné, že mi vrátí stejný list jako nyní mám, jelikož tam žádná nová místnost za tu vteřinu nevznikla ani nezanikla.

Pro ukázku můj kod:

            while (GameStates.Room == GameState.GetCurrentState())
            {
                lobbies = Query.GetLobbies();
                if (listBox1.Items.Count != lobbies.Count)
                {
                    listBox1.Items.Clear();
                    for (int i = 0; i < lobbies.Count; i++)
                    {
                        ListItem listItem1 = new ListItem();
                        listItem1.Text = string.Format("{0}   {1}/4", lobbies[i].Name, lobbies[i].NumberOfPlayers());
                        listItem1.Color = Color.White;
                        listBox1.Items.Add(listItem1);
                    }
                }
                Thread.Sleep(1000);
            }

2) Způsob o kterém přemýšlím, že bych tam implementoval je ten, že server si o každém klientovi bude vést údaje v jakém stavu se aktuálně nachází a pokud bude ve stavu, ve kterém bude čekat na list místností, tak server neustále bude kontrolovat jestli v jeho listu místností nějaká nová přibyla nebo naopak ubyla a poté by tento list až poslala všem svým klientům. Ale u toho se mi zase zdá jestli moc nevytěžuji server, jelikož to asi budu muset spustit tuto kontrolu na dalším novém vláknu.

Jinými slovy o aktualizaci listů na straně klienta by se měl starat server, nebo klient?

Co si o tom prosím myslíte?

Díky :-) 

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
8. 8. 2021   #2
-
+1
-
Zajímavé

#1 Kubas129
Typický případ užití vzoru Observer:

  1. Klient si na serveru zaregistruje žádost o aktualizaci místností
  2. Server si eviduje seznam žádostí klientů - abonentů
  3. Pokud nastane změna stavu místností, rozešle oběžník abonentům
  4. Klient na tento oběžník zareaguje tak, že si ten seznam místností stáhne a provede si aktualizaci

Nahlásit jako SPAM
IP: 85.160.41.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kubas1290
Stálý člen
8. 8. 2021   #3
-
0
-

#2 Kit
aha díky :-) 

jdu si to nastudovat jak se to implementuje :D

Nahlásit jako SPAM
IP: 62.141.28.–
Kubas1290
Stálý člen
8. 8. 2021   #4
-
0
-

#2 Kit
onoasi  i něco podobného pak bude s chatem pokud ho tam budu chtít mít v té hře

Nahlásit jako SPAM
IP: 62.141.28.–
9. 8. 2021   #5
-
0
-

Myslím, že seznam hráčů mají všichni stejný (např ve skupině) a tak stačí aby server při příchodu nebo odchodu hráče (do/ze skupiny) rozeslal oběžník (členům skupiny) s novým seznamem. Jen selský rozum bez návrhových vzorů.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
9. 8. 2021   #6
-
0
-

#5 hlucheucho
Když se změní počet položek v listu, tak List<T> neumožnuje žádnou událost nějakou typu: počet položek se změnil?

Jsem si vygooglil, že na to je nějaký BindingList<T>. Jaký je mezi prosím nimi rozdíl? Můžu tento list v pohodě používat místo klasického List<T>?

Nahlásit jako SPAM
IP: 62.141.28.–
9. 8. 2021   #7
-
0
-

Jak se změní List? Přece tím, že do něj přidám položku nebo položku z něj odeberu. Tedy samotné přidávání nebo odebírání položky je tou událostí která vyvolá update seznamů u klientů.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
9. 8. 2021   #8
-
0
-

#7 hlucheucho
a jo, můžu ještě poprosit o názorný kod, který po přidání a odebrání  prvku do/z listu zavolá void metodu()?

Se o to pokouším, ale mám s tím nějaký problém :(

Nahlásit jako SPAM
IP: 62.141.28.–
gna
~ Anonymní uživatel
1498 příspěvků
9. 8. 2021   #9
-
0
-

   

list.Add(neco);
ListChanged(list);
Nahlásit jako SPAM
IP: 213.211.51.–
9. 8. 2021   #10
-
0
-

Hráče do Listu přidáváš voláním jeho (= Listu) metody Add. Následně pak zavoláš metodu, která rozešle nový seznam. Je otázka, kterému objektu metoda patří, jakou má viditelnost...  A zase jsme u návrhu co který objekt dělá a jak objekty mezi sebou spolupracují.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
9. 8. 2021   #11
-
0
-

#9 gna
obávám se, že v jeho případě to takto přímočaré nebude. Ale je to jen domněnka.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
9. 8. 2021   #12
-
0
-

#9 gna
když tohle není úplně co hledám. Když přidávání a odebírání prvků  do/z listu mám v n metodách, tak bych chtěl spíše nějakou událost, nebo něco takového která by mi pro provedení této operace automaticky zavolala tu metodu a nemusel jsem se pokaždé, když do listu přidám a odeberu prvkem starat ještě o volání této další metody :(

Nahlásit jako SPAM
IP: 62.141.28.–
9. 8. 2021   #13
-
+1
-
Zajímavé

Tak si napiš metody AddUser, RemoveUser a uvnitř těchto metod volej vše potřebné, co se změnou seznamu hráčů souvisí. A tam, kde se seznam hráčů mění, volej tyto metody. Myslím, že si zbytečně komplikuješ život.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
9. 8. 2021   #14
-
0
-

#13 hlucheucho
Jo to by asi šlo, nějak mě to ani nenapadlo, že by se to taky dalo udělat takto, díky :-))

ps. nemá někdo zkušenost ještě s tím BindingList<T>, který má přímo události pro změny prvků? Jinak je docela i zajímavé, že se tento list nenachází ani v knihovně System.Collections.Generic.

https://docs.microsoft.com/cs-cz/dotnet/api/system.componentmodel.bindinglist-1?view=net-5.0 

System.Collections.Generic

Nahlásit jako SPAM
IP: 62.141.28.–
Mutagen
~ Anonymní uživatel
514 příspěvků
9. 8. 2021   #15
-
0
-

#13 hlucheucho
Já si zase myslím, že si ho spíš ulehčuje a to tím, že píše sem (na české forum) aby jsme mu vymysleli řešení, které si stejně udělá úplně jinak namísto vyhledávání na google, kde vše na co se tu ptal je lehce dohledatelné do pár minut i s examplama.

Pokud jsem to dobře pochopil snaží se udělat něco v XNA (nejsem si přesně jist, ale nepřestal se XNA nějak před několika lety vyvýjet?) Nebylo by pro něj lepší na tu hru použít nějaký gameengine (např. Unity3D též v C#) s tisicema návodů na yt, či dokonce přímo na jejich ofic. stránách?

Nahlásit jako SPAM
IP: 185.138.71.–
Kubas1290
Stálý člen
9. 8. 2021   #16
-
0
-

#15 Mutagen
No vychází to z XNA.

https://www.monogame.net/

Nahlásit jako SPAM
IP: 62.141.28.–
Mutagen
~ Anonymní uživatel
514 příspěvků
9. 8. 2021   #17
-
0
-

#16 Kubas129
Tak co třeba zkusit Unity3D? Též se v tom píše v C# a nemusel bys řešit žádný vlákna (pokud bys vysloveně nechtěl), mnoho návodů skoro na vše, a je to doslova GameEngine, takže lehčí práce s objektama, animacema, apod.

Nahlásit jako SPAM
IP: 185.138.71.–
Kubas1290
Stálý člen
9. 8. 2021   #18
-
0
-

#17 Mutagen

Na ten MonoGame jsem si už nějak tak zvyknul a hlavně už mám cca 50% té hry napsanou a ty kolekce bych tam stejně i tak musel podle mě řešit. Jinak co se týče ještě toho listu, tak jsem narazil ještě na jeden typ kolekce ObservableCollection<T>, která má přímo událost na, která se vyvolá v případě, že je položka přidána, odebrána, změněna, přesunuta nebo je obnoven celý seznam.

Což se mi zdá taky jako fajn :-)

Nahlásit jako SPAM
IP: 62.141.28.–
Mutagen
~ Anonymní uživatel
514 příspěvků
9. 8. 2021   #19
-
0
-

#18 Kubas129
A to je tak těžký si napsat vlastní proceduru na změnu jak tu někdo už psal?

AddUser, RemoveUser, apod a k tomu udělat jednu univerzální listChanged(list) kde provedeš přesně to co potřebuješ např pošleš klientům a oni si nový list nastaví? Hledáš něco složitého v něčem co je úplně triviální.

Nahlásit jako SPAM
IP: 185.138.71.–
9. 8. 2021   #20
-
+1
-
Zajímavé

#19 Mutagen
Vynalézat hranatý kolo je zábavnější :)

hu

Nahlásit jako SPAM
IP: 195.178.67.–
9. 8. 2021   #21
-
0
-

Jestli trváš na událostech, můžeš si udělat potomka třídy List a události mu dotvořit takto: potomek bude mít 4 pomocné atributy OnBeforeAdd, OnAfterAdd, OnBeforeRemove a OnAfterRemove, do kterých se bude ukládat delegát na metodu obsluhující událost. Dále u potomka překryješ metodu Add, v jejím těle pomocí delegáta zavoláš událost BeforAdd, pak zavoláš Add metodu předka a nakonec pomocí delegáta událost AfterAdd. Totéž uděláš pro Remove.

Napíšeš hromadu kódu, dá to hromadu práce a nasekáš v tom hromadu chyb.

Kdyby takové události měly smysl, asi by to třída měla již implementované.

hu

Ještě pozn.: bramboračku nebo guláš mám raději na talíři.

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Super člen
9. 8. 2021   #22
-
0
-

Když použiješ ObservableCollection tak tak je přímo událost při změně kolekce to by ti mělo stačit, používá se to i ve WPF a MVVM

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:7953:7f70:195e:7e6f...–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Podobná vlákna

Server a Klient — založil infomf

Klient vs. applikacny server — založil Mr.Smith

Klient-Server aplik. — založil Wladimir

Aplikace klient - server — založil zvire

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý