Vhodný formát pro internetovou komunikaci – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vhodný formát pro internetovou komunikaci – .NET – Fórum – Programujte.comVhodný formát pro internetovou komunikaci – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Kubas1290
Stálý člen
15. 7. 2021   #1
-
0
-

Ahoj,

potřeboval bych radu, vytvářím multiplayerovou hru a zasekl jsem se u způsobu přes jaký formát (vím, že ve výsledku je to proud bytů) odesílat data ze serveru na klienta.

Zatím jsem se dozvěděl dvě možnosti resp. 3.

1) Odesílat pomocí řetězce, tak že všechny proměnné napíšu do řetězce a pošlu to klientovi a klient si to z toho řetězce zase vezme - o tento způsob se snažím, ale dostávat to z toho řetězce zpátky na proměnné je pro mě opravdu hard :(

2) odesílat to přes BitWriter a číst pomocí BitReaderu -to se mi nepodařilo zprovoznit

3) a za 3. jsme se dozvěděl o nějakém způsobu pomocí Json souborů

Který je prosím nejlepší?

Díky moc :)

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

V čem se to vlastně odesílá v reálných aplikací klient- server?

Nahlásit jako SPAM
IP: 62.141.28.–
16. 7. 2021   #3
-
0
-

Práce s řetězcem mi nepříjde složitá. Jde to udělat tak, že každá hodnota má v řetězci své pevné místo, jednotlivé hodnoty oddělit např středníkem. Při příjmu řetězec zase rozdělíš (string má na to metodu, podívej se na Split() ) a získané hodnoty vložíš do proměnných. Druhá možnost je do řetězce vkládat pár jméno : hodnota a jednotlivé páry oddělit středníkem. V takovém případě nemusí mít každá hodnota své místo, mohou být řazeny v řetězci libovolně (na tomhle principu fungují JSON, je to v podstatě řetězec). Tolik o vytvoření vlastní serializace a deserializace. Jednodušší mi příjde použít něco hotového. Podívej se na serializace / deserializace, popř. zkus do Google zadat "C# create JSON"

Při hledání serializace a deserializace narazíš např na https://docs.microsoft.com/cs-cz/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0  Možná by bylo lepší hledat výsledky v angličtině, strojový překlad nebývá ideální.

hu

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

Já osobně bych použil serializaci. Je to asi nejjednoduší postup, sice budeš posílat data navíc (ale to asi v dnešní době pár bytů navíc nevadí) a třídy bych rozlišoval podle prvního byte, který si ke každýmu poli přidáš

public static byte[] Serialize<T>(T aData)
{
	BinaryFormatter formatter = new BinaryFormatter();
	using (MemoryStream ms = new MemoryStream())
	{
		formatter.Serialize(ms, aData);
		return ms.ToArray();
	}
}

public static T Deserialize<T>(byte[] aData)
{
	BinaryFormatter formatter = new BinaryFormatter();
	using (MemoryStream ms = new MemoryStream(aData))
	{
		return (T)formatter.Deserialize(ms);
	}
}

Nějaká tvoje třída dat který chceš posílat (např. pohyb)

[Serializable]
public class Movement
{
	public float X;
	public float Y;
	public float Z;

	public Movement(int x, int y, int z)
	{
		this.X = x;
		this.Y = y;
		this.Z = z;
	}
}

A použití

Movement lMovement = new Movement(5, 5, 5);
byte[] lMovementToBytes = Serialize<Movement>(lMovement);
Movement lBytesToMovement = Deserialize<Movement>(lMovementToBytes);

Je to psaný na koleni, možná tam budou chyby.

Za mě asi nejjednoduší cesta (záleží jestli nutně potřebuješ jen text nebo třeba kompletní třídy, kde máš data)

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

#4 Mutagen
Díky moc za tip, že tento se mi zdá z těch všech taky nejlepší.

Že rozdělit  ten řetězec pomocí metody string.split, která bere za argument pouze char by bylo pro mě dost hard, když strukturu, kterou jsem posílal byla nějak takto: <code_room><p>"param1"</p><p>"param2"</p></code_room><code_room><p>"param1"</p><p>"param2"</p></code_room>....

U toho Json jsem zjistil, že mi do toho programu nejde na to přidat reference, že jsem si založil konzolovou aplikaci, která by potenciálně měla během i na linuxech a mac a toho jsonsna to snad nabízí jen u toho jednoho typu, který je čistě pro window (aspon tak jsem to pochopil)

Jen já ten obor názvů using System.Runtime.Serialization.Formatters.Binary; vůbec neznám, dá se nějak odstranit tento zápis [Serializable] před tou třídou (já jen že se mi tam moc nelíbí)?

a zadruhé mohu v té třídě mít i kolekce (pole a listy) - zabalí se i jejich hodnoty, nebo jen reference někam do paměti a až to pošlu na jiný pc na klienta, tak mu to hodí  chybu?

Díky moc :)

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

#5 Kubas129
Parsuj to jako XML.

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

#6 Kit
vždyt jo, snad to tak i mám vždy mám otevírací a uzavírací tag s tím, že první mi značí o kterou třídu se jedná a ty další značí její parametry, které posílám, ale stejně se mi asi nejlepší zdá ta serializace jen nevím jestli se přes ní dají zabalovat i ty kolekce, které se odkazují na tu haldu

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

#5 Kubas129
Jak napsat Kit, pokud to máš takto a nechceš to udělat jako datovou strukturu, tak to parsuj jako xml a máš vyřešeno.
Jinak [Serializable] to, že se ti nelíbí je sice fajn, ale prostě tam být musí pokud to chceš prohánět přes serializaci. Musí to být u každé třídy, kterou chceš tímto způsobem zpracovávat.

A ano můžeš tam mít i kolekce, pole cokoliv a samosebou, že stejně definované třídy musíš mít i ve druhé aplikaci aby je to dokázalo načíst. Pokud by ses pokusil poslat serializovaný data třídy Movement tak ti při čtení třeba třídy Combat vyhodí error, proto ten první byte co bys přidal k poli by značilo co to je za třídu
např.

byte 0x00 = Movement class
byte 0x01 = Combat class

než to pošleš do Deserialize tak vymažeš první byte

switch (array[0]):
case 0x00:
	Movement lBytesToMovement = Deserialize<Movement>(array);
break;
case 0x01:
	Combat lBytesToCombat = Deserialize<Combat>(array);
break;
Nahlásit jako SPAM
IP: 185.138.71.–
Kit+15
Guru
16. 7. 2021   #9
-
0
-

#7 Kubas129
Co s tím mají společného tagy? Snad to neparsuješ jako text?

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

#9 Kit
no původně jsem to měl na straně serveru takto:

        private static string getRooms()
        {
            string message = null;
            for(int i= 0; i< rooms.Count;i++)
            {
               message+= (String.Format("<room><p>{0}</p><p>{1}</p></room>", rooms[i].ID, rooms[i].NumberOfPlayers));
            }
            return message;
        }

kde message se pak odeslala (po převodu na pole bytů) na klienta, a právě pak je docela pro mě hard z toho všechny ty promenné z toho dostat zase nazpátek :D

Nebo to jde nějak lépe napsat pomocí těch tagů?

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

#10 Kubas129
C# má knihovny pro generování i parsování XML a JSON. Stačí je jen použít.

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

#8 Mutagen
 

Byte má 8 bitů. takže můžu mít něco kolem 256 různých tříd, které následně můžu odesílat, ještě jsem se chtěl zeptat asi ta serializace nebude taky fungovat tehdy, když na straně serveru bude třída se stejným názvem o dvou proměnných a na straně klienta bude stejně nazvaná  třída jen kromě dvou proměnných jich bude mít 5 včetně těch dvou stejně nazvaných proměnných jako na serverovské části?

#11 Kit
Jaké to jsou prosím knihovny?

Díky moc

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

#12 Kubas129
No to nebude, musejí byt přesně 1:1 aby to z dat šlo přečíst. Otázka spíš zní, proč mít jinak udělanou třídu v jednom programu a ve druhým též jinak?

Jinak né kolem 256, ale přesně 256. Popřípadě pokud chceš víc tříd tak si tam posílej 2 byte za sebou (ushort) a máš hned 65535 tříd k dispozici.

Asi nejjednoduší bude když si vytvoříš třídu přesně tech dat co chceš posílat a s tím budeš dál pracovat, podle mě je zbytečný něco víc vymýšlet a parsovat, když ti serializace vyřeší vše a nemusíš se o nic starat.

Nahlásit jako SPAM
IP: 185.138.71.–
JerryM0
Věrný člen
16. 7. 2021   #14
-
0
-

#1 Kubas129
nehledáš náhodou tohle ?

https://stackoverflow.com/questions/61611808/serialize-c-sharp-objects-to-a-json-to-a-server

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:28d3:ded3:89ce:1a4b...–
Kit+15
Guru
16. 7. 2021   #15
-
0
-

#12 Kubas129
Například XmlDocument.

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

#8 Mutagen
a musejí se i shodovat statické a instanční třídy?

Já jen, že třeba na straně klienta je jen jeden hráč, takže tato třída by spíš měla být statická, protože se nepředpokládá, že bych z ní vytvářel instance, zatožto na straně serveru, tam těch hráčů bude plno, takže tam by spíš měla být instanční (nvm zda slovo instanční existuje, ale myslím nestatickou třídu, ze které se dají vytvářet isntance)?

Nahlásit jako SPAM
IP: 62.141.28.–
JerryM0
Věrný člen
16. 7. 2021   #17
-
0
-

#16 Kubas129
???? cože ????

https://stackoverflow.com/questions/9321/how-do-you-create-a-static-class-in-c

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:28d3:ded3:89ce:1a4b...–
JerryM0
Věrný člen
16. 7. 2021   #18
-
0
-

https://www.tutorialspoint.com/cplusplus/cpp_static_members.htm

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:28d3:ded3:89ce:1a4b...–
Mutagen
~ Anonymní uživatel
549 příspěvků
16. 7. 2021   #19
-
0
-

#16 Kubas129
Co??? Já vůbec o žádných statických třídách nepsal. Vůbec nevim smysl toho co jsi napsal.

To co chceš ze serveru posílat tomu klientovi na to si udělej třídu. Nechápu co nechápeš na tom, když jsem to za tebe defakto napsal, jen třídy musíš udělat sám, protože jen ty víš co za data potřebuješ posílat.

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

#8 Mutagen
a dá se v té metodě Serialize přidat na první prvek toho bytového pole ten byte a pokud ano tak kde prosím? Anebo to pole, které ta metoda vrátí musím vzít a celé prvek po prvku ho překopírovat do nového pole, které bude o jedno políčko větší a pak to tam pridat?

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

#20 Kubas129
Dalo by se to napsat nějak takto?

        public static byte[] Serialize<T>(T aData)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                byte mujByte = 0x09;
                formatter.Serialize(ms, mujByte);
                formatter.Serialize(ms, aData);
                return ms.ToArray();
            }
        }

Jen problém je, když to vrácené pole projedu cyklem, tak na první pozici stále místo hodnoty 9, vidím jen 0 :(

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

#20 Kubas129
Možná by nebylo odvěci nejdřív začít se základama programování. A proč bys to přidával přímo do metody si na to udělej nadstavbu co ti to vrátí i s tvým přiznakem.

Btw. Array.Copy

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

#21 Kubas129
 

public static byte[] Nadstavba<T>(byte aID, T aData)
{
	byte[] lData = Serialize<T>(aData);
	byte[] lDataWithID = new byte[lData.Length + 1];
	Array.Copy(lData, 0, lDataWithID, 1, lData.Length);
	lDataWithID[0] = aID;

	return lData;
}

použití:
byte[] lTest = Nadstavba<Movement>(0x09, lMovement);
Nahlásit jako SPAM
IP: 185.138.71.–
Kubas1290
Stálý člen
16. 7. 2021   #24
-
0
-

#23 Mutagen#23 Mutagen
Stejně a nebude to zbytečné plýtvání procesorovým časem? :D

Já jen, když předem vím, že to pole bude ve výsledku o jeden byte větší, než ho vrátí na metoda Serialize, tak nebylo by efektivnější si to větší pole vytvořit už v tý metodě a začít tam zapisovat ty data tý třídy až na druhý místo v tom poli? 

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

#24 Kubas129
Pokud máš pocit, že moje řešení ti nevyhovuje, nepoužívej ho a udělej si vlastní :) Jen by mě zajímalo jak budeš dopředu vědět jak velký bude pole, když velikost pole ti vytvoří Serialize metoda. Samosebou za předpokladu, že budeš mít předem definovanou velikost pole a přesně rozloženou strukturu packetu, tak ano.

Spíš to vypadá, že nemáš ani pořádně základní znalosti a snažíš se udělat něco hodně nad rámec svých zkušeností, ale pokud si myslíš, že uděláš lepší řešení, tak udělej.

Nahlásit jako SPAM
IP: 185.138.71.–
JerryM0
Věrný člen
16. 7. 2021   #26
-
0
-

stačí když do Googlu zadáš heslo "WCF C# send data to server" a máš tam spoustu příkladů pomocí knihovny WCF. funguje to moc dobře .. .

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:28d3:ded3:89ce:1a4b...–
Kubas1290
Stálý člen
16. 7. 2021   #27
-
0
-

#25 Mutagen
Já jsem to spíš myslel, tak jestli by v této metodě:

public static byte[] Serialize<T>(T aData)
{
	BinaryFormatter formatter = new BinaryFormatter();
	using (MemoryStream ms = new MemoryStream())
	{
		formatter.Serialize(ms, aData);
		return ms.ToArray();
	}
}

se nedalo nějak asi z toho MemoryStreamu zjistit, jak velké pole bude potřebovat a udělat ho už rovnou o ten jeden prvek větší a data z MemoryStream zapisovat až na druhý prvek s tím, že na ten první prvek by se zatím umístila třeba nula..která by se pak přepsala, ale nvm jestli se to tak dá udělat.. jak píšeš tolik zkušeností s tím nemám, hlavně né s touto knihovnou

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

#26 JerryM
to je pomocí těch tagů?

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

#16 Kubas129
Pokud nechceš skončit v pekle závislostí, vyhni se statickým třídám velkým obloukem. Jsou to jen pozůstatky z dob strukturovaného programování. Nepřináší žádné výhody, pouze nevýhody.

Nahlásit jako SPAM
IP: 81.19.2.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
16. 7. 2021   #30
-
0
-

#28 Kubas129
Co máš pořád s těmi tagy? Copak používáš SAX?

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

#4 Mutagen
Poradil bys mi prosím ještě s tím kodem? Když jsem si ho zkusil v jednom programu, tak to šlo v poho serializovat a opět Deserializovat, tak jsem to zkusil aplikovat na klienta a server a hází mi to v metodě Deserialize tuto chybu: System.InvalidCastException: 'Unable to cast object of type 'System.Byte' to type 'TCPRecever.Movement'.'

Přitom struktury obou tříd jak na klientovi, tak i na serveru jsou stejné, jediné co se teda liší je namespace, ale to by snad vadit tomu nemělo, jediné co si říkám, že by tomu možná mohlo vadit je, že na klientské části přijímám ty byty do většího pole, ale tak za tím jsou pak nuly, které snad značí konec řetězce

Nevíš prosím kde jsem udělal chybu?

Tohle je serverovská část:

using System;
using System.IO;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;

namespace TCPRecever
{
    class Program
    {  
       private const Int32 port = 2050;
       
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(Listen));
            Console.WriteLine("Nasloucham..");
            thread.Start();
            
        }
        public static void Listen()
        {
            TcpListener tcpListener = new TcpListener(IPAddress.Any, port);
            tcpListener.Start();
            while (true)
            {
                TcpClient tcpClient = tcpListener.AcceptTcpClient();
                NetworkStream ns = tcpClient.GetStream();
                
                byte[] buffer = new byte[1024];
                int recv = 0;
                ns.Read(buffer, 0, buffer.Length);
                foreach (byte b in buffer)
                    if (b != 0)
                        recv++;
                Movement newMovement = Deserialize<Movement>(buffer);
                Console.WriteLine("Trida {0}", newMovement.X); 
                Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, recv));

                Console.WriteLine();
                
                StreamWriter sw = new StreamWriter(tcpClient.GetStream());
                sw.WriteLine("you rock!");
                sw.Flush();

            }
            //tcpClient.Close();
            //tcpListener.Stop();
        }
        public static T Deserialize<T>(byte[] aData)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream(aData))
            {
                return (T)formatter.Deserialize(ms);
            }
        }
    }
}

 a tohle klientská:

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;

namespace TCPClient
{
    class Program
    {
        private static TcpClient client = null;
        private static NetworkStream netStream = null;
        static void Main(string[] args)
        {
            Movement mv = new Movement(5, 5, 5);
            try
            {
                while (true)
                {   
                    byte[] byteBuffer = Serialize<Movement>(mv);
                    client = new TcpClient("192.168.1.107", 2050);
                    Console.WriteLine("Spojeni navazano..odesilam");
                    netStream = client.GetStream();
                    netStream.Write(byteBuffer, 0, byteBuffer.Length);
                    Console.WriteLine("Odeslano");
                    netStream.Flush();

                    StreamReader sr = new StreamReader(netStream);
                    Console.WriteLine(sr.ReadLine());
                    Console.WriteLine("konec");
                    netStream.Close();
                    client.Close();
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("CHYBA{0}",ex);
            }
        }
        public static byte[] Serialize<T>(T aData)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                byte mujByte = 0x09;
                formatter.Serialize(ms, mujByte);
                formatter.Serialize(ms, aData);
                return ms.ToArray();
            }
        }

    }
}

 A tohle třída

using System;
using System.Collections.Generic;
using System.Text;

namespace TCPRecever
{
    [Serializable]
    class Movement
    {
        public float X;
        public float Y;
        public float Z;

        public Movement(float x, float y, float z)
        {
            this.X = x;
            this.Y = y;
            this.Z = z;
        }
    }
}
Nahlásit jako SPAM
IP: 62.141.28.–
Kubas1290
Stálý člen
16. 7. 2021   #32
-
0
-

#31 Kubas129
oni přeci jenom ta velikost těch polí musí být na obou stranách asi stejná co?

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

#32 Kubas129
ale ono ikdyž to pole snížím přesně na velikost té classky, tak to hodí stejnou chybu, tak nejsem si jistý jestli tohle je ten problém

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

#33 Kubas129
Pevná velikost je dobrým základem budoucích problémů.

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

#34 Kit
jn, ale tak zkusil jsem to jestli to není příčina té chyby, vůbec nevím v čem tam ta chyba je :((

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

#35 Kubas129
Od jisté doby dělám všechny velikosti dynamicky, místo polí kolekce a tak. Zpracování vstupu řídím tokem dat a je to pohodička. Program je pak jednoduchý a spolehlivý.

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

#36 Kit
tjn. ale list bytu nelze vytvořit ne?

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

#37 Kubas129

  1. List bajtů lze vytvořit
  2. Proč bych ho dělal?

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

#38 Kit
tak já bych to mohl využít na ten NetworkStream, protože to je proud bytů

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

#39 Kubas129
Určitě to má nějakou vyšší strukturu. 4 bajty int, délka stringu, string,... To jsou 2 položky.

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

Tak já to udělám přes ten Json ono to asi tak bude nejlepší :-)

Díky všem za rady :-)

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

#41 Kubas129
JSON nebo CSV jsou docela použitelné formáty.

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

#42 Kit
Narazil jsem u JSON na problém. Je možný je JSON je délkově limitován? Já jen, že když se snažím poslat kolekci objektů (list), která má více než 12 položek, tak to pak při dekompresi hodí chybu

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

#43 Kubas129
Délkový limit tam není. Spíš se obávám, že jsi použil nějaký nepovolený znak (např. uvozovky) bez patřičného eskejpování. Ani s českými znaky není JSON kamarád.

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

#44 Kit
kdepak, žádné znaky jsem nepoužil, nijak jsem ten řetězec neupravoval, jen jsem si vytvořil kolekci instancí třídy a tu jsem pak následně celou převedl pomocí Jsona na řetězec a následně poslal na klienta a u něj ta dekomprese funguje pouze tehdy, když je to méně než 13 položek (instancí tý třídy) v tý kolekci. Je to opravdu divné. Jako první mě napadlo jestli to není bufferem, ale když jsem ho masivně zvýšil, tak to pořád házelo stejnou chubu, tak mě napadlo jestli to nemají nějak omezené

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

#31 Kubas129
Víš co, já ti poradil víc než dost, to, že tvoje znalosti tomu bohužel nestačí, už není moje chyba. To co jsem ti sem vše popsal sám používám ve svých hrách a nikdy jsem s tím problém neměl.

Ono by asi nejdřív stálo za pořádný návrh tvojí aplikace a tím se řídit, protože sám asi bastlíš z vody a zkoušíš co a jak dělá (neboj taky jsem to dřív dělal), ale když ti něco pošlu co je funkční a použitelný a ty k tomu vymýšlíš "jak to udělat jinak" tak je prostě chyba u tebe.

To co pošleš, to příjmeš.

Proč něco tvořit staticky? Já třeba statický třídy používám pouze když potřebuju 1 instanci na celej program/hru.

Vidím, že vlákno je označeno za vyřešené, ale nikde tu nevidím jak se to vyřešilo. Bylo by dobré pro další lidi, kdyby měli stejný problém aspoň sem hodit jak jsi to vyřešil a nejlíp i s částí kodu?

Nahlásit jako SPAM
IP: 185.138.71.–
Kit+15
Guru
19. 7. 2021   #47
-
0
-

#46 Mutagen
Statické třídy nepoužívám vůbec. Pozdější refaktoring by mohl být zbytečně drahý.

Nahlásit jako SPAM
IP: 81.19.2.–
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ů
19. 7. 2021   #48
-
0
-

#47 Kit
Tak já to taky nepoužívám na každou blbost, ale vím, že třída "GameManager", "Settings", "LevelManager", ... Prostě refaktorovat nikdy nebudu. Ale je fakt, že v klasickým programu sem to nepoužil taky už nějakej ten rok, jen u her.

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

#48 Mutagen
I když, teď si přesně nejsem jist, jestli statická třída = singleton, pokud je to rozdíl tak používám jen singletony.

Nahlásit jako SPAM
IP: 185.138.71.–
Kit+15
Guru
19. 7. 2021   #50
-
0
-

#49 Mutagen
Na singleton není statika potřebná ani vhodná.

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

Mám problém s JSON a nevím jak to vyřešit :(

Mám třídu A, ve které mám kolekci instancí třídy B. Třídu A zabalím do Jsona a na druhé straně jí rozbalím, ale v kolekci, která předtím byla plná už nic není :(

Nevěděl by někdo prosím, jak se to dá řešit?

Díky moc

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

aha, tak oni ty všechny složky v tý třídě musejí být public (kolekci sjem měl jako jedinou private), dá se to nějak udělat, aby mohla být private?

Další problém mám, že přes TCP se mi odešle jen půlka řetězce, neví někdo čím to je? :(

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

#51 Kubas129
Tu kolekci zábal a nechej si ji vypsat jako text. Když nám ji pošleš, tak bychom tu chybu měli najít.

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

#53 Kit
Díky za tip :-) s tím zabalením a vypsáním na txt zkusím zítra, snad tím zachovám to zapouzdření, jinak už jsem i zjistil čím bylo způsobený, že se mi vždy odeslala jen půlka řetězce, on v tom StreamWriteru je bufffer, který má defaultně nastavený limit na 1024 bytů, tak jsem ho zvýšil a jde to v poho.

Ale stejně si říkám, jestli ta velikost těch buffrů by nešla měnit nějak dynamicky za pochodu, že já tam posílám řetězce někdy jen třeba 5 znakový a jindy ten řetězec má třeba i 4 k znaků, například to bytový pole jak tam je vždycky, není nějaký způsob jak z toho vytvořit třeba list, jehož velikost by se nastavovala podle potřeby? :-)

Nahlásit jako SPAM
IP: 62.141.28.–
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, 12 hostů

 

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