Anonymní profil Jakub – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Jakub – Programujte.comAnonymní profil Jakub – Programujte.com

 

Příspěvky odeslané z IP adresy 62.141.28.–

.NET › Window server - cloud
22. 9. 2021   #388646

Ahoj,

nevěděl by někdo o "free" na nějaké zkušební zkoušení window server, na který bych mohl umístit ten server (konzolová apka v C#) a tu databázku (MYSQL - 3 tabulky). Případně nějaký Linux server, ale tam nevím jestli by to tam šlo spustit?

Díky :-)

.NET › Výpočet souřadnic pro aktuál…
18. 9. 2021   #388633

#3 Seth
spouštím to na Full screen, ale s tím poměrem stran si nejsem jistý jestli to bude ok, ale tak beru, že většina používá 16:9

.NET › Výpočet souřadnic pro aktuál…
18. 9. 2021   #388631

#1 Kubas129
Super už jsem na to snad přišel pomocí procent :-)

.NET › Výpočet souřadnic pro aktuál…
18. 9. 2021   #388630

Ahoj,

snažím se o to přizpůsobit všechny textury ve hře aktuálnímu rozlišení displeje. Aktuální rozlišení displaje získat není problém, na to už je zabudovaná funkce, která to už zjistí. Problém, ale mám že hru mám navrženou fixně na Full HD (1920 x 1080) a potřeboval bych všechny komponenty přepočítat na toto aktuální rozlišení.

Například 2D obdelníkoví vektor herní desky je (420, 0, 1080, 1080), kde první dvě číslice udávají pozici od horního levého roku a poslední dvě číslice udávají velikost (sizeX, sizeY). Převést první dvě hodnoty například na rozlišení 2K (2560x1440) by mělo jít lehce pomocí trojčlenky:

X:

1920.............................................420

2560.............................................x

-----------------------------------------------------

(1920/2560) = (x/420) => x= (2560/1920)*420

x= 560

Podobně pro Y:

1440...........................................y

1080...........................................0

----------------------------------------------------

y=(1080/1440)*0

y=0

-------------------------------------------------------

S čím mám ovšem problém je převést poslední dvě čísla. Potřeboval bych najít mezi nimi a rozlišením nějakou závislost, pomocí které by se dali snadno přepočítat.

Nevěděl by si prosím s tímto někdo rady?

Správný výsledek pro tu herní desku z tohoto Full HD(420,0,1080,1080) by měl vyjít na 2K (560,0,1440,1440)

Zkoušel jsem to přes poměr k_x=x_původní/size_x_původní

k_x = 1920/1080 =>1,77

a pak pomocí trojčlenky:

1920......................1,77

2560,,,,,,,,,,,,,,,,,,,,,,,,k_x_2K

---------------------------------

k_x_2K = 2,36 

Size_x_2K = 2560/2,36 => 1084,74 což jak je vidět nevychází :(( (mělo by vyjít 1440)

Snad jestli počítám správně, tak pro tyto rozlišení by ta deska měla mít tyto hodnoty:

HD (1280x720) => (320,0,720,720)

Full HD (1920, 1080) => (420,0,1080,1080)

2K (2560x1440) => (560,0,1440,1440)

.NET › Přístup do mysql databázky
15. 9. 2021   #388622

#4 Kit
To provedu jak? :(

Takto?

        public bool IsNickFree(string nick)
        {
            if (mySqlConnection.State != ConnectionState.Open)
            {
                mySqlConnection.Open();
            }
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
        }
.NET › Přístup do mysql databázky
15. 9. 2021   #388619

#2 Kit
Díky, takže nějak takto je to ok? :-)

namespace MonopolyServer.Database
{
    class Connection
    {
        private MySqlConnection mySqlConnection = null;
        public Connection()
        {
            mySqlConnection = new MySqlConnection();
            try {
                MySqlConnectionStringBuilder mysqlConfiguration = new MySqlConnectionStringBuilder();
                mysqlConfiguration.Database = "monopoly";
                mysqlConfiguration.Server = Dns.GetHostName();
               // mysqlConfiguration.Server = "192.168.1.102";
                mysqlConfiguration.Port = 3306;
                mysqlConfiguration.UserID = "server";
                mysqlConfiguration.Password = "Monopoly123";
                mySqlConnection.ConnectionString = mysqlConfiguration.ConnectionString;

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        public bool IsNickFree(string nick)
        {
                mySqlConnection.Open();
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
        }
        public bool RegisterNewPlayer(User user)
        {
            return true;
        }
         ~Connection()
        {
            mySqlConnection.Close();
        }
    }
}
.NET › Dynamické rozložení ovládací…
15. 9. 2021   #388617
.NET › Přístup do mysql databázky
15. 9. 2021   #388616

Můžu se prosím ještě zeptat jestli mám dobře navrženou komunikaci server- databáze? Že nejsem si ještě jistý jestli jsem jí navrhl dobře, tak aby se vzájemně nerušila.

Je okey tato architektura? 

Jsem si založil pro komunikaci s MYSQL serverem samostatnou třídu, tím že v jejím konstruktoru se sestaví ConnectionString a vloží se do MySqlConnection a poté jednotlivé metody této třídy budou otevírat a opět zase zavírat spojení a dále se dotazovat databázky a ukládat do ní další data.

Ale jde mi spíš hlavně o to, že pak v hlavním programu jsem si vytvořil jednu statickou instanci této třídy, takže všechny nová vlákna, která se vytvoří pro jednotlivé klienty budou využívat tuto stejnou instanci. Otázka kterou si kladu je co se stane, když program z více vláken zavolá stejnou metodu této třídy, která bude přistupovat do této databáze a vrtat se v ní, jestli to bude ok? Nebo jestli program spadne - jako podobně to bylo s tou internetovou komunikací (jak jsem tam pak musel přidat ty věci na tu synchronizaci vláken :D)

Nebo je to lepší předělat, tak aby se vždy založila nová instance této třídy extra v každé metodě, která bude volat nějakou její metodu? 

Takto nějak vypadá ta třída pro tu komunikaci s databázkou:

using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using MonopolyServer.Server.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace MonopolyServer.Database
{
    class Connection
    {
        private MySqlConnection mySqlConnection = null;
        public Connection()
        {
            mySqlConnection = new MySqlConnection();
            try {
                MySqlConnectionStringBuilder mysqlConfiguration = new MySqlConnectionStringBuilder();
                mysqlConfiguration.Database = "monopoly";
                mysqlConfiguration.Server = Dns.GetHostName();
               // mysqlConfiguration.Server = "192.168.1.102";
                mysqlConfiguration.Port = 3306;
                mysqlConfiguration.UserID = "server";
                mysqlConfiguration.Password = "Monopoly123";
                mySqlConnection.ConnectionString = mysqlConfiguration.ConnectionString;

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                mySqlConnection.Close();
            }
        }
        public bool IsNickFree(string nick)
        {
            try
            {
                mySqlConnection.Open();
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
            }
            finally
            {
                mySqlConnection.Close();
            }
        }
        public bool RegisterNewPlayer(User user)
        {
            return true;
        }
    }
}

Díky moc :-))

.NET › Dynamické rozložení ovládací…
15. 9. 2021   #388611

Vypadá to dost zajímavě :-)

.NET › Dynamické rozložení ovládací…
15. 9. 2021   #388606

#9 JerryM
o tom Vulkanu slyším poprvé, to je taky nějaká engine na vývoj her?

.NET › Dynamické rozložení ovládací…
15. 9. 2021   #388603

#6 JerryM
to používám v tom Monogame - XNA

.NET › Dynamické rozložení ovládací…
15. 9. 2021   #388601

#4 JerryM
v tomto :D

https://github.com/rds1983/Myra/wiki

.NET › Hashování hesla
15. 9. 2021   #388600

#2 gna
díky, takže teda z klienta to heslo na server můžu posílat v obyčejném stringu. Stejně si říkám, že takto se to asi v reálu nepoužívá :D 

    class User
    {
        public string Nick { get; set; }
        public string Password { get; set; }
        public string info { get; set; }
        public bool success { get; set; } = false;

        public User(string nick, string pass)
        {
            this.Nick = nick;
            this.Password = pass;
        }	
}
.NET › Hashování hesla
15. 9. 2021   #388596

Ahoj,

mohl bych se ještě please zeptat jak je to s Hashovánmí hesla?

Když mám tu strukturu klient -> server -> databázka a klientská část nabízí uživateli přihlášení a registraci, tak stačí to heslo zahashovat až na straně serveru, nebo by bylo fajn už to nějak upravit to heslo na straně klienta?

díky :-))

ps. někde na netu jsem našel, že se k tomu hodí tato funkce:

public string HashHesla(string salt, string heslo)
        {
            string SourceText = salt + heslo;
            Byte[] a = Encoding.UTF8.GetBytes(SourceText);
            Byte[] b;
            SHA512Managed c = new SHA512Managed();
            b = c.ComputeHash(a);
            string HashText = Convert.ToBase64String(b);
            return HashText;
        }
.NET › Dynamické rozložení ovládací…
14. 9. 2021   #388593

Ahoj,

mám problém s přijitím na to jak vytvořit dynamické okno, tak aby když uživatel změní velikost okna, tak aby se všechny prvky jako jsou TextBoxy, tlačítka a labely přizpůsobili novému rozlišení, tudíž aby se bud zmenšili či zvětšili. 

Se získání aktuální velikosti okna nemám problém:

int windowWith = Program.Game.Window.ClientBounds.Width;
int windowHeight = Program.Game.Window.ClientBounds.Height;

Ale můj problém nastává už při umístění prvních dvou prvků, konkrétně labelu a textBoxu:

Label si umístím na pozici, která bude odpovídat 5ti % z celkové šířky okna

label3.Left = (windowWith / 100) * 5;
label3.Id = "label1";
label3.Text = "Zadej svůj nick:";

Nyní vedle tohoto labelu bych chtěl umístit textBox, ale nevím jak můžu určit Y souřadnici kam jej umístit, tak aby se tyto prvky vzájemně nepřekrývali, ale zároven aby od sebe nebyly příliš daleko?

Poté oba tyto prvky dávám do panelu, který následně vykreslím na okno.

Jak prosím mohu zjistit šířku, kterou zabírá label s textem?

Případně existuje nějaký lepší způsob jak okno vytvořit dynamické?

Díky moc :-))

.NET › Server
13. 9. 2021   #388586

Ahoj,

potřeboval bych poradit, když do těch monopolů zahrnu ještě SQL server, tak je dobré když k němu přistupuje pouze server je to jedno pokud s ním i komunikuje klient?

díky :-)

.NET › JSON - DeserializeObject
10. 9. 2021   #388575

Ahoj,

mám třídu Board, která obsahuje List<Tile>, kde Tile je abstraktní třída, od které dědí další třídy: ChanceCard, ChestCard, DiceCard, Tax, Train a Street. Pokouším se na straně serveru tento List zabalit do Jsona (úspěšně) a na straně klienta ho opět rozbalit a všechny instance z tohoto listu překopírovat do stejného typového listu. V tom ale program hodí chybu s touto hláškou:

{"Could not create an instance of type Monopoly.MonopolyGame.Model.Tile. Type is an interface or abstract class and cannot be instantiated. Path '[0].Index', line 3, position 12."}

Prosím nevěděl by někdo řešení tohoto problému?

Díky moc :)

List<Tile> list = JsonConvert.DeserializeObject<List<Tile>>(desObj);
//takto mám to rozbalování, které hodí error
.NET › Nesmyslný error
13. 8. 2021   #388424
.NET › Nesmyslný error
13. 8. 2021   #388423

#3 Kubas129

Jo aha ono to vše musí být public ty třídy

.NET › Nesmyslný error
13. 8. 2021   #388422
.NET › Nesmyslný error
13. 8. 2021   #388420

Co je prosím tohle za chybovou hlášku?

Severity Code Description Project File Line Suppression State
Error CS0050 Inconsistent accessibility: return type 'Lobby' is less accessible than method 'MonopolyServer.findLobby(Guid)' MonopolyServer C:\Users\kubas\OneDrive\Plocha\Monopoly\MonopolyServer\Server\Server.cs 303 Active

Mám tuto metodu:

        public static Lobby FindLobby(Guid idLobby)
        {
            for (int i = 0; i < client.Room.Lobbies.Count; i++)
            {
                if (client.Room.Lobbies[i].IDLobby == idLobby)
                    return client.Room.Lobbies[i];
            }
            return null;
        }
.NET › C# ukazatelé
12. 8. 2021   #388383

#16 JerryM
Jak to myslíš? :)

.NET › C# ukazatelé
11. 8. 2021   #388381

#14 Mutagen
když já nevím jak, jediný v čem jakž tak umím je malování ve windows, které myslím že nepodporuje vrstvy, takže když pak z něho poté ten obrázek naimportuji, tak zabere celý čtverec :(

.NET › C# ukazatelé
11. 8. 2021   #388378

#11 JerryM
Díky, ale už jsem nějak tak přečetl C# step by step a C# programujeme profesionálně (neříkám 100% z toho :D), bych chtěl napřed dopsat ty monopoly už mám takových 70% z toho, ale chybí mi ještě někde sehnat domečky   v png. Bych chtěl mít žlutý, červený, zelený a modrý a ještě hotýlky téže barvy. Nezdá někdo nějakou stránku, kde by se tyto sprity daly zadarmo stáhnout? :-)

.NET › C# ukazatelé
11. 8. 2021   #388375

#9 Kubas129
Je v C# něco jako kopírovací konstruktor jako v C++?

.NET › C# ukazatelé
11. 8. 2021   #388374

Už jsem asi přišel čím to bylo. Jak používám toho Jsona na přenos dat, tak on si vždy vytvoří novou instanci (teda podle mě), takže proto se pak už neodkazují na stejné místo v paměti :)

.NET › C# ukazatelé
11. 8. 2021   #388371

#5 Mutagen
nn, ale měl jsem dva listy do, kterých jsem přidával stejnou instanci třídy, a když jsem v jednom tom listě této instanci některé její atributy pozměnil, tak se změna neprojevila v druhém listě a naopak, což mi přišlo divné.

.NET › C# ukazatelé
10. 8. 2021   #388365

#19 Mutagen
Ahoj,

Jak můžu prosím v C# zjistit zda více instancí stejných referenčních typů jsou v haldě uložený na stejném místě?

            Player pl1 = clients[0].player;
            Player pl2 = room.Players[0];
            unsafe
            {
                if (&pl1 == &pl2) //nefunguje
            }
.NET › Filozofie komunikace klient…
9. 8. 2021   #388360

#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 :-)

.NET › Filozofie komunikace klient…
9. 8. 2021   #388358

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

https://www.monogame.net/

.NET › Filozofie komunikace klient…
9. 8. 2021   #388356

#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

.NET › Filozofie komunikace klient…
9. 8. 2021   #388354

#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 :(

.NET › Filozofie komunikace klient…
9. 8. 2021   #388350

#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 :(

.NET › Filozofie komunikace klient…
9. 8. 2021   #388348

#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>?

.NET › Filozofie komunikace klient…
8. 8. 2021   #388346

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

.NET › Filozofie komunikace klient…
8. 8. 2021   #388345

#2 Kit
aha díky :-) 

jdu si to nastudovat jak se to implementuje :D

.NET › Filozofie komunikace klient…
8. 8. 2021   #388343

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 :-) 

.NET › Zamíchání kolekce
7. 8. 2021   #388340

#9 JerryM
to ne, ale tak předpokládám že tento kod bude nejrychlejší

freePawns = freePawns.OrderBy(x => (new Random().Next(0,4))).ToList();

.NET › Zamíchání kolekce
7. 8. 2021   #388338

#7 Kubas129
možná už to jde takto:

freePawns = freePawns.OrderBy(x => (new Random().Next(0,4))).ToList();

:-)

.NET › Zamíchání kolekce
7. 8. 2021   #388337

#2 gna
Ten List to podtrhává červeně

(Pawn je výčtový typ)

List<Pawn> freePawns = new List<Pawn> { Pawn.blue, Pawn.green, Pawn.red, Pawn.yellow };

freePawns = freePawns.OrderBy(x => ((Pawn)(new Random().Next(0,4))).ToList()); //Pawn does not cointain definition for ToList
            
for(int i=0;i<lobby.players.Length;i++)
{
  if (lobby.players[i] != null)
    lobby.players[i].Pawn = freePawns[i];
}
.NET › Zamíchání kolekce
7. 8. 2021   #388333

#2 gna
přesně tohle jsem zkoušel, ale problém jsem měl s tím překonvertováním zpět.

List<string> jmena = new List<string> {"Karel", "Hynek", "Jozin"};
Random random = new Random();
var neco = jmena.OrderBy(x => random.Next()).ToList();

jmena = neco?
.NET › Zamíchání kolekce
6. 8. 2021   #388331

ahoj,

je nějaký způsob jak přes LINQ zamíchat list o 4 prvcích?

Díky :-)

.NET › Generátor unikátních čísel
4. 8. 2021   #388329

#3 Kubas129
On už to Microsoft nepodporuje? Asynchronní volání delegáta, konkrétně BeginInvoke EndInvoke metody a, nejsou v prostředí .NET Compact Framework podporována.

https://docs.microsoft.com/cs-cz/dotnet/standard/asynchronous-programming-patterns/calling-synchronous-methods-asynchronously

Se mi tohle zdála jako dobrá vychytávka

.NET › Generátor unikátních čísel
4. 8. 2021   #388328

Dá se nějak vyřešit chyba typu: System.PlatformNotSupportedException: 'Operation is not supported on this platform.'?

private delegate void deChecking(); 
.
.           
	    deChecking dc = checking;
            IAsyncResult rs =dc.BeginInvoke(null, null);
            while(!rs.IsCompleted)
            {
                Console.WriteLine("cekam na dokonceni ulohy");
                Thread.Sleep(500);
            }
.
.
.
private static void checking()
{}

Asi jsem měl na to založit nové vlákno co?

.NET › Generátor unikátních čísel
3. 8. 2021   #388326

Je nějaký způsob jak vygenerovat čtyři čísla v náhodném pořadí v  intervalu <0;3>?

Mám takové tušení, že by to mělo jít nějak přes jazyk LINQ, bohužel v něm téměř nic neumím, ale mám list hráčů a každému bych chtěl přiřadit unikátní číslici od 0 do 3, nenapsal by mi to prosím někdo? :-))

players[0].pawn = ..

players[1].pawn = ..

players[2].pawn = ..

players[3].pawn = ..

.NET › Cross-thread operation not v…
3. 8. 2021   #388325
.NET › Cross-thread operation not v…
3. 8. 2021   #388324

#32 Kubas129
vypadá to dost zajímavě, navíc určitě by bylo lepší tu hru mít na webu než-li jako aplikaci, která by se musela stahovat, ale na to mi chybí znalosti krom toho asi by to nešlo propojit s MonoGame.

.NET › Cross-thread operation not v…
3. 8. 2021   #388323

Se ale koukám, že je potřeba si pro .ASP založit nový typ aplikace ASP.NET Web Application, to asi nejde přidat do Monogames jako další knihovnu?

.NET › Cross-thread operation not v…
3. 8. 2021   #388322

#30 hlucheucho
není MVC zkratka pro architekturu Model - View - Controller?

.NET › Cross-thread operation not v…
3. 8. 2021   #388320

#27 hlucheucho
jo to zní fajn, jen škoda že ASP neumím napsat ani čárku :D

Ale co se týče těch statistik, tak mohl bych se na začátku připojit k nějaké databázce s tím, že by si uživatel, tam vždy musel založit nějaký účet a přihlašovat se pak následně na něj

.NET › Cross-thread operation not v…
3. 8. 2021   #388316

#24 hlucheucho
super díky moc :-) S tím timerem to funguje jak má :-)

Jen si říkám, bude to to jedno vlákno stíhat? Nebo jak funguje ten Timer, když jsem to napsal takto:

            System.Timers.Timer timer = new System.Timers.Timer(500);
            timer.Elapsed += checking();      

To pořád probíhá v tom jednom vlákně s tím, že se každých 500 ms zavolá metoda checking že jo? :-)

   

.NET › Cross-thread operation not v…
3. 8. 2021   #388314

#22 Kit
a jak to funguje?

.NET › Cross-thread operation not v…
3. 8. 2021   #388310

#18 hlucheucho
Je pravda, že to moc dobře naprogramovaný nemám, ale nvm jak to vymyslet lépe.

Nyní to mám tak, že hlavní tok programu spouští v Lobby nové vlákno, které se každých 300 ms zeptá serveru jestli v Lobby přibyli noví hráči a pokud ano, tak je vypíše do ListBoxu a zároven se taky ptá serveru, jestli master hráč hru spustil a pokud ano, tak přepne na nový stav hry, ve kterém se vykreslí hrací deska.

Problém je, ale že od této chvíle hlavní hra běží v novém vláknu, takže bych to potřeboval opět dostat do hlavního vlákna.. nějak :D 

.NET › Cross-thread operation not v…
3. 8. 2021   #388308

#16 Kit
ale tak přece, když vím že tuto třídu použiji jen jednou a nebudu vytvářet žádnou instanci, tak použití statické třídy se jeví jako dobré řešení ne? Například  Board máme jen jednu hrací desku, takže proč ne static Board?

.NET › Cross-thread operation not v…
3. 8. 2021   #388306

Jasně no, ale tak na netu se dají stejné ne-li přehlednější informace najít i zadarmo, jen teda nevýhoda toho je, že je to většinou v aj. 

Třeba tady jsem našel, že je  možné přepínat mezi vlákny pomocí tohoto kodu:

  //switch to UI thread
  this.Invoke((MethodInvoker)delegate {
    // this bit runs on the UI thread
    this.Text = newText;

Akorát teda tomu kodu moc nerozumím. Když ten svůj kod mám ve statické třídě, tak ani this použít nemůžu, jelikož statická třída ani  nemůže vytvářet další instance. Nevysvětlil by mi tu prosím někdo tento kus kodu co provádí? 

Díky moc :-)

Případně jsem ho vzal odsud:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/447970ba-1384-4b07-9566-395dad9db90d/crossthread-operation-not-valid-control-accessed-from-a-thread-other-than-the-thread-it-was?forum=csharpgeneral

.NET › Cross-thread operation not v…
3. 8. 2021   #388303

#11 hlucheucho
nechce se mi za to platit :D

.NET › Cross-thread operation not v…
3. 8. 2021   #388301

#7 Mutagen
Zkusil jsem použít eventy, ale vypadá to, že stále jsou v tom samém vlákně, ve kterém se volají, ikdyž jejich definice probíhá v hlavním vlákně. Jdu se podívat na internet snad něco užitečného najdu co mi pomůže :-)

.NET › Cross-thread operation not v…
3. 8. 2021   #388300

Fajn zjistil jsem, že bez toho pomocného vlákna se přeci jen neobejdu, problém mám ovšem v tom, že poté celá aplikace již nadále běží v tomto novém vláknu, je nějaký způsob, kterým bych se opět vrátil do původního vlákna? Tak abych nadále mohl používat komponenty z prvního vlákna atd..

pozn. zkoušel jsem Task.Wait(), než se daná úloha dokončí, ale výsledkem toho je zamrznutí celé aplikace, jelikož Monogame potřebuje v hlavním vlákně vykonávat 60x za vteřinu metody Update a Draw (které samozřejmě nemůže vykonávat, když čeká na dokončení jiné úlohy - ve které je nekonečný cyklus) -aspon tak jsem to pochopil

Můžu se pomocí události vrátit z nového vlákna do hlavního vlákna?

.NET › Cross-thread operation not v…
2. 8. 2021   #388293

Zjistil jsem, že se vlastně bez toho pomocného vlákna můžu obejít, ale stejně by mě zajímalo jaký je rozdíl mezi Task a Thread. Co jsem vyčetl, tak snad třída Task by měla sama od sebe spolupracovat a využívat třídu Thread a fond vláken ThreadPool. Ale proč teda by programovací prostředí nabízelo uživateli i samotnou třídu Thread?

.NET › Cross-thread operation not v…
2. 8. 2021   #388291

Jaký je rozdíl mezi třídou Task a třídou Thread ? Cháou správně, že obě tyto třídy spustí nové vlákno?

Proč pouze třída Task má metodu WaitAll()? Má třída Thread obdobnou metodu? 

.NET › Cross-thread operation not v…
2. 8. 2021   #388290

#1 Kubas129
Nebo je možný v hlavním vláknu počkat na dokončení vedlejšího vlákna? Přes nějaký příkaz

.NET › Cross-thread operation not v…
2. 8. 2021   #388289

Ahoj,

při svém programování jsem narazil na další chybu se, kterou si nevím rady :(

Ve vedlejším vláknu mám spuštěný cyklus, ve kterém vždy po nějaké době se ptám serveru, jestli vedoucí spustil hru (tím, že přes JSON aktualizuju třídu, ve které mám bool IsGameOn) a pokud ano, tak poté se daná hra spustí všem ostatním hráčům, kteří jsou v dané lobby.

Problém, ale je že poté se hlavním tokem programu stane právě toto vlákno, u kterého potřebuji, aby mohlo přistupovat k ostatním prvkům v programu (jako jsou například Labely, Buttony atd..) a právě pokud toto vlákno se pokusí změnit nějakou hodnotu těmto prvkům, tak program hodí chybu typu: Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

Díval jsem se, že se to řeší přes nějakého BackgroundWorker, ale moc jsem nepochopil jak to funguje.

Nejlepší by pro mě bylo, kdyby se z tohoto vedlejšího vlákna, se vyvolala nějaká událost (vzávisloti na té proměnné IsOnGame), která by běh programu opět vrátila do hlavního vlákna, akorát moc nevím jak na to :(

Nepomohl by mi s tím prosím někdo? 

Moc díky :-)

.NET › Server - Klient logika
28. 7. 2021   #388265

#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 :-)

.NET › Server - Klient logika
28. 7. 2021   #388263

#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);
}
.NET › Server - Klient logika
28. 7. 2021   #388261

#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/

.NET › Server - Klient logika
28. 7. 2021   #388259

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

.NET › Server - Klient logika
28. 7. 2021   #388256

#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á

.NET › Server - Klient logika
28. 7. 2021   #388253

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

.NET › Server - Klient logika
28. 7. 2021   #388252

#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? :(

.NET › Server - Klient logika
27. 7. 2021   #388251

#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

.NET › Server - Klient logika
27. 7. 2021   #388249

#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? :)

.NET › Server - Klient logika
27. 7. 2021   #388246

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 :-)

.NET › Delegát - návratová hodnota
26. 7. 2021   #388237

Ahoj,

po nějaké době mám opět problém tektokrát s delegáty.

Mám 3 metody. Všechny tyto  metody přijímají 2 stejné parametry a vrací object. Proto jsem si  založil delegáta, do  kterého jsem umístil adresy těchto metod.

Problém mám, ale s tím, že s těmi referenčními typy, které ty metody vracejí bych potřeboval dále pracovat a nevím jak se j ním dostat, vždy v proměnné je jen jedna hodnota z metody, která se prováděla jako poslední, je nějaký způsob jak všechny tyto návratové hodnoty z pomocí delegátu získat?

Díky moc :)

        private delegate object CreatePlayer(ContentManager content, Pawn pawn);
        private CreatePlayer createPlayer;
            createPlayer += UIInitializer.CreateFigure;
            createPlayer += UIInitializer.CreateTemplate;
            createPlayer += UIInitializer.CreateFigureInTemplate;

           var ob = createPlayer.Invoke(content, Pawn.blue); /*do var ob se umisti pouze navratova hodnota z metody CreateFigureInTemplate
.NET › Internetová komunikace - pro…
21. 7. 2021   #388233

#6 gna
jo tím to asi bude moc díky :-) 

Takže teda statická třída a statický atributy jsou jen jedny v celý aplikaci včetně ikdyž jsou spuštěny s jiného vlákna? Tudíž bych měl tu statickou třídu a všechny její atributy změnit na instanční? (nebo jak se nazývají ty třídy co nejsou statické)

.NET › Internetová komunikace - pro…
21. 7. 2021   #388231

#4 gna
jako říkal jsem si, že je to zajímavý, že kdž to mámm oddělený, tak jsem moc nechápal co způsobuje tu chybu, ale na internetu jsem se dočetl, že ten typ chyby WSACancelBlockingCall znamená, že se druhé vlákno snaží něco poslat přes TCPClienta, když je zrovna využíván jiným vláknem a od té doby co jsem to tam dal, tak to tolik nezlobí a více méně to funguje už plynule. 

Tak nevím co tento typ vyjímky ještě mohlo vyvolávat :(

.NET › Internetová komunikace - pro…
21. 7. 2021   #388229

#2 gna
moc díky, ten první způsob s tím zámkem vypadá, že mi funguje (u druhého mi to i přes to hodilo nějakou chybu).

Zkontroloval bys mi prosím ještě tu classku, jestli jsem v ní ten zámek implementoval správně?

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

namespace Monopoly
{
    public static class Communication
    {
        private static TcpClient client = null;
        private static NetworkStream networkStream = null;
        private static byte[] buffer;
        private const string IP = "192.168.1.103";
        private const int PORT = 2050;
        private static Mutex socketLock = new Mutex();

        public static string GetCode(CODES code, params object[] ob)
        {
            socketLock.WaitOne();
                string send = JsonConvert.SerializeObject(code, Formatting.Indented);
            if (ob != null)
            {
                for (int i = 0; i < ob.Length; i++)
                    send += ";" + JsonConvert.SerializeObject(ob[i], Formatting.Indented);
            }
            int bytesRead = 0;
            buffer = new byte[6068];
            client = new TcpClient(IP, PORT);
            networkStream = client.GetStream();
            networkStream.Write(Encoding.UTF8.GetBytes(send));
            networkStream.Flush();

            networkStream.Read(buffer, 0, buffer.Length);
            networkStream.Close();
            client.Close();
            foreach (byte b in buffer)
            {
                if (b != 0)
                {
                    bytesRead++;
                }
            }
            socketLock.ReleaseMutex();
            return Encoding.UTF8.GetString(buffer, 0, bytesRead);
        }
    }
}
.NET › Internetová komunikace - pro…
21. 7. 2021   #388227

ahoj,

mám problém a nevím si s ním rady :(

Snažím se udělat lobby do, které se budou připojovat hráči, ale narazil jsem na problém. V lobby mám list připojených hráčů a dvě tlačítka (odejít, hrát). 

Na aktualizaci listu hráčů jsem spustil samostatné vlákno, které v určitém časovém intervalu (1,3 sekundy) se ptá serveru na obsah listu (jestli se někdo nový nepřipojit, nebo naopak někdo neodpojil), problém je ovšem v tom, že tyto dvě vlákna věží nesynchronně a když hráč klikne na tláčitko Odejít (může to být i tlačítko Hrát), tak je zde určitá nemalá šance, že se bude klient snažit poslat serveru info o hráčově odchodu z lobby, ve chvíli, kdy se druhé vlákno ptá serveru na obsah listu.. a to mi potom hodí chybu: WSACancelBlockingCall

Nevěděl by někdo prosím jak tento problém vyřešit?

Díky moc :-)

.NET › Vhodný formát pro internetov…
20. 7. 2021   #388225

#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? :-)

.NET › Vhodný formát pro internetov…
19. 7. 2021   #388223

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? :(

.NET › Vhodný formát pro internetov…
19. 7. 2021   #388222

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

.NET › Vhodný formát pro internetov…
17. 7. 2021   #388197

#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é

.NET › Vhodný formát pro internetov…
17. 7. 2021   #388192

#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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388188

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

Díky všem za rady :-)

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388186

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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388184

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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388182

#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 :((

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388180

#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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388179

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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388178

#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;
        }
    }
}
.NET › Vhodný formát pro internetov…
16. 7. 2021   #388174

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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388173

#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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388169

#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? 

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388166

#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 :(

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388165

#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?

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388161

#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)?

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388157

#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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388155

#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ů?

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388151

#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

.NET › Vhodný formát pro internetov…
16. 7. 2021   #388149

#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 :)

.NET › Vhodný formát pro internetov…
15. 7. 2021   #388145

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

 

 

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