Server - Klient logika – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Server - Klient logika – .NET – Fórum – Programujte.comServer - Klient logika – .NET – Fórum – Programujte.com

 

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

Ahoj,

potřeboval bych radu ohledně logiky, má být všechna logika a výpočty probíhat na serveru a klient jen příjímat data, nebo může i klient provádět i nějaké výpočty, které pak pošle serveru? 

Jde mi o to, že mám ve hře kostky, jejichž čísla se generují na klientské části a pak jsou posílána na server, tak jestli je to tak správně, nebo jestli by to mělo být naopak?

Díky :-)

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
27. 7. 2021   #2
-
0
-

#1 Kubas129
Co uděláš, když ti klient podvrhne hod, který se mu hodí?

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

#2 Kit
myslím, že takovou klientelu mít nebudu :D

navíc kdyby to chtěl podvrhnout, tak to by musel upravit zdroják nebo ne?

Takže radši kvůli bezpečnosti to mám dát na server? :)

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
27. 7. 2021   #4
-
0
-

#3 Kubas129
Tady nejde jen o konkrétní klientelu, ale že si tím vytvoříš určitý návrhový vzor, který pak budeš moci použít i pro nehodnou klientelu.

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

#4 Kit
Jasný no :-)

ps. neznáš něco jak bych mohl u tý TCP komunikace dynamicky rozšiřovat to pole bytů? Já jen, že ty třídy, které posílám už nabývají na rozměrech a příjíde mi škoda tam mít staticky definované strašně velké pole, když ve většině přenosech není potřeba

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

#5 Kubas129
ještě googlím a našel jsem tohle: You need to transmit the size before sending the array so that the other end knows how much to read.

Je to jediný způsob? :(

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

#6 Kubas129
https://stackoverflow.com/questions/16897972/receive-socket-with-dynamic-byte-size

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
28. 7. 2021   #8
-
0
-

#7 Kubas129
Tohle bych vyřešil serializací dat, například přes JSON. Je to skoro bez práce.

Nahlásit jako SPAM
IP: 85.160.12.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Mutagen
~ Anonymní uživatel
549 příspěvků
28. 7. 2021   #9
-
0
-

Vše co ovlivnuje chod hry dělat na serveru.

Hráč hodí kostkou, tím se pošle požadavek na server aby vygeneroval hod, ze serveru jen vrátíš hráčovi výsledek se kterým pracuješ.

Vše co je na hráčovi straně se dá ovlivnovat a opravdu nemusí upravit zdroják.

Jinak co tu čtu, tak se zase řeší ten problém co se řešil asi 3 vlákna zpět.

Nahlásit jako SPAM
IP: 185.138.71.–
Kubas1290
Stálý člen
28. 7. 2021   #10
-
0
-

#8 Kit
tjn, tak to i mám, ale občas ten odesílaný řetězec je o 100 znacích, jindy o 1000 + znacích a jeden znak by měl (co jsem četl) zabírat 2 byty

#9 Mutagen
jj, tak ono se to dost prolíná

Nahlásit jako SPAM
IP: 62.141.28.–
28. 7. 2021   #11
-
+1
-
Zajímavé
Kit +

Změna velikosti pole jde udělat samozřejmě taky. Zkusil bych hledat " C# Array Resize", možná se ta metoda přímo jmenuje Resize. Osobně bych se tím netrápil, použil bych List, tím bych bez práce získal "samovelikostní pole" a pak ho vrátil jako pole. Má na to metodu. To se tu nedávno řešilo stejně jako serializace a deserializace. Myslím, že byla navržena 3 řešení: 1. udělat z toho řetězec, napsat na to vlastní kód, 2. udělat JSON, což znamená udělat z toho řetězec, ale s minimem vlastního úsilí a 3. udělat xml, jestli se dobře pamatuju, dostals odkazy na to, jak to udělat.

Co se týče toho co udělat na serveru a co na klientovi: musíš vzít v úvahu nakolik potřebuješ mít věci pod kontrolou aby klient nemohl "fixlovat" naproti tomu může být výhodné snížit zátěž serveru tím, že přeneseš část práce na klienta.

Virtuální svět se v mnohém podobá světu reálnému, proto ti byl navržen model ála casino: hráč nevezme kostky do ruky, vždy háže krupiér. Klient (= hráč) pošle na server (= krupiér) "hoď kostky" a server pošle klientovi "padlo ti ..."

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kit+15
Guru
28. 7. 2021   #12
-
0
-

#11 hlucheucho
Vůbec bych se nezdržoval s nějakým array resize, ale rovnou bych použil kolekci.

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

#12 Kit
kdyby to šlo, tak bych jí tam dal :(

Nahlásit jako SPAM
IP: 62.141.28.–
28. 7. 2021   #14
-
0
-

#12 Kit
Záleží na tom, kterou kolekci by použil. Např. se nedoporučuje používat ArrayList, místo něj doporučují používat List https://docs.microsoft.com/cs-cz/dotnet/api/system.collections.arraylist?view=net-5.0  s ohledem na výkon (u serveru podstatná věc).

#13 Kubas129
Pořád mi není jasný důvod k trvání na polích. Ať je to kolekce nebo List ať synchronizované (vhodné pro vícevláknové aplikace) nebo nesychronizované, nenapadá mne žádný důvod k vlastní implementaci. Vlastní implementace znamená hromadu práce a riziko hromady chyb. Možná by bylo na místě přehodnotit koncepci.

hu

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

#14 hlucheucho
nvm no, ale v metodě StreamRead() se mi list of bytes vložit nepodařilo, podle mě to ani nejde, že všichni všude dávají tam pole: https://www.universal-robots.com/articles/ur/interface-communication/tcpip-socket-communication-via-urscript/

Nahlásit jako SPAM
IP: 62.141.28.–
Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
28. 7. 2021   #17
-
0
-

#16 hlucheucho
dokázal by teda někdo pole v tomto kodu změnit na list, tak aby ten kod fungoval? :-)

 Díky :-)

private const int Port = 3762;
private static SocketPermission permission = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "", Port);
private static IPHostEntry ipEntry = Dns.GetHostEntry(string.Empty);
private static IPAddress ipAddress = ipEntry.AddressList[0];
private static IPEndPoint ipPoint = new IPEndPoint(ipAddress, Port);

Socket sTransmissao = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

using (var stream = new MemoryStream())
{
    var binary = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    binary.Serialize(stream, TransmissaoPendencias);
    byte[] bArray = new byte[stream.Length];
    stream.Seek(0, SeekOrigin.Begin);
    stream.Read(bArray, 0, (int)stream.Length);

    sTransmissao.Connect(ipAddress, Port);
    sTransmissao.Send(bArray);
}
Nahlásit jako SPAM
IP: 62.141.28.–
28. 7. 2021   #18
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
28. 7. 2021   #19
-
0
-

#18 hlucheucho
 

Tohle už mám dávno vyřešené :-)

Jde o to, že ve  výsledku je to posloupnost bytů, které musím uložit do nějaké datové struktury. A i tady v tom příkladu  se mi zdá, že pro příjem těchto bytů používají staticky alokované pole bytů, nikoliv ten list. 

Jsem četl, že snad přes list  se to udělat snad ani nedá, že se to řeší tak, že napřed se má  poslat informace kolik bytů odesílací strana posílá a přímajicí strana tuto informaci má zpracovat, tak že má vytvořit pole o této velikosti.

Každopádně, ale kdyby to šlo přes ten list, že bych tuto informaci o počtu bytů k odeslání nemusel posílat bylo by to pro mě fajn :-)

Nahlásit jako SPAM
IP: 62.141.28.–
28. 7. 2021   #20
-
0
-

   

public static T Deserialize<T>(this Stream stream)
    {
        return (T)new BinaryFormatter().Deserialize(stream);
    }


žádný Array tam nevidím, jenom třídu BinaryFormatter, https://docs.microsoft.com/cs-cz/dotnet/api/system.runtime.serialization.formatters.binary.binaryformatter?view=net-5.0

Není vyloučeno, že interně používá povinnou hlavičku s délkou a kontrolnímy Byty jako třeba CRC následovanou sekvencí datových Bytů. Ale to není moje starost, někdo to naprogramoval a odladil a já mám bez práce hotový řešení.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Mutagen
~ Anonymní uživatel
549 příspěvků
29. 7. 2021   #21
-
0
-

#20 hlucheucho
Doslova a dopísmene jsem mu toto posílal i cca 3 vlákna zpět, jen trošku jinak zformulovaný.
Tolik vláken a vše se točí okolo 1 problému.

Nahlásit jako SPAM
IP: 185.138.71.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×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, 13 hostů

Podobná vlákna

Server a Klient — založil infomf

Aplikace klient - server — založil zvire

Klient-Server aplik. — založil Wladimir

Java klient + C server — založil Dejv

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

 

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