1

Тема: Поясніть за стрімрідери

Добридень панове. Якось показував свій код на лівому форумі і мені сказали, що за такий код

BitConverter.GetBytes(char_id).CopyTo(bf,index);
               
                BitConverter.GetBytes(x).CopyTo(bf,index+4);
                BitConverter.GetBytes(y).CopyTo(bf,index+8);
                BitConverter.GetBytes(z).CopyTo(bf,index+12);
               
                BitConverter.GetBytes(rx).CopyTo(bf,index+16);
                BitConverter.GetBytes(ry).CopyTo(bf,index+20);
                BitConverter.GetBytes(rz).CopyTo(bf,index+24);
                BitConverter.GetBytes(rw).CopyTo(bf,index+28);

били б по руках нагайкой і ще додали щось про стрімрідери. Так от питання, як працюють ці стрімрідери і як можна мій кусок кода переписать з використанням цих стрімрідерів?

2

Re: Поясніть за стрімрідери

По-перше, цей код страшний. З сотень знаків реально корисних - один рядок, а потім по одному-двом символам на рядок.
А по-друге, ви взагалі про таку річ, як MSDN, чули?

3

Re: Поясніть за стрімрідери

koala написав:

По-перше, цей код страшний. З сотень знаків реально корисних - один рядок, а потім по одному-двом символам на рядок.
А по-друге, ви взагалі про таку річ, як MSDN, чули?

угу, чув

4

Re: Поясніть за стрімрідери

ну почитав я той мсдн, але толку з того

5

Re: Поясніть за стрімрідери

ну я тут покищо бачу тільки один вихід, можна було б цикл зробити, очевидно. Але ж змінні різні, можна запихнути їх в массив, звичайно. Але якщо тип змінних різний?

6

Re: Поясніть за стрімрідери

Знаєте, я, щиро кажучи, нічого хоч трохи серйозного на C# не писав - так, глянув колись, як воно працює і все.
Але чомусь я можу знайти класи NetworkStream і StreamWriter на MSDN.
Може, у нас інтернет різний?

7

Re: Поясніть за стрімрідери

да я теж знайшов стрім врайтер, одразу після знаходження стрим рідера, але толку з того

8

Re: Поясніть за стрімрідери

using(BinaryWriter toServer=new BinaryWriter(new NetworkStream(globalConnection.s)))//ніби це так робиться в шарпі, але ідея ніби очевидна
{
  toServer.Write(char_id);
  toServer.Write(x);
  ...
  toServer.Write(rw);
  toServer.FlushAsync();//зливаємо все в уніт... е... сокет, не тримаючи основний потік
}

Читати аналогічно.
Якщо хвилюєтеся за буферизацію - BufferedStream в поміч.

9

Re: Поясніть за стрімрідери

koala написав:
using(BinaryWriter toServer=new BinaryWriter(new NetworkStream(globalConnection.s)))//ніби це так робиться в шарпі, але ідея ніби очевидна
{
  toServer.Write(char_id);
  toServer.Write(x);
  ...
  toServer.Write(rw);
  toServer.FlushAsync();//зливаємо все в уніт... е... сокет, не тримаючи основний потік
}

Читати аналогічно.
Якщо хвилюєтеся за буферизацію - BufferedStream в поміч.

перший раз таке бачу, піду розбиратись
p.s. а що таке "уніт"?

10 Востаннє редагувалося User 298 (05.07.2013 16:28:10)

Re: Поясніть за стрімрідери

TRYCUKI_V_KROVI написав:
koala написав:
toServer.FlushAsync();//зливаємо все в уніт... е... сокет, не тримаючи основний потік

p.s. а що таке "уніт"?

"Уніт.." - сокет, що має дещо специфічний функціонал. :)

11 Востаннє редагувалося FakiNyan (05.07.2013 16:55:18)

Re: Поясніть за стрімрідери

Ну якесь воно не рідне. Якшо використовувати бінарний потік, то дані відправляются по частинам. Наприклад, відправляю по черзі три значення типу int, а на сервері пише, то одне повідомлення - прийшло 12 байтів, то два повідомлення - прийшло 4 байтів, прийшло 8 байтів. Спробував буферізований потік, так він же працює з буфером даних, тобто всеодно треба конвертувати дані в байти, пихати в буффер і так відправляти. Тоді яка різниця, що я запихую дані по одному в буфер, а потім відправляю одним блоком, як в стартовому пості, чи я буду запихувати так само дані в буфер але відправляти за  допомогою буферізованого потоку? Я, ось, не впевненний, якщо використовувати буферізований потік, то зникає необхідність в зазначені індексів? Ну тобто, якщо раніше ми мали один буффер, потім конвертували дані в байти і пихали в цей буфер, то нам треба було зазначати індекс, з якого починається запис в буффер, а з буферізованим потоком ми просто пихаємо в буффер різні дані і нам всеодно на індекс, тому що він сам зсвувається? а нє, всеодно треба ж вказувати offset. Тоді я взагалі не розумію цінність цих рідерів.

12

Re: Поясніть за стрімрідери

BufferedStream bs=new BufferedStream(new NetworkStream(globalConnection.s)));
BinaryWriter toServer=new BinaryWriter(bs);

Так не пробували? Тепер налаштовуємо BufferedStream так, як нам треба, і пишемо простими Write-ами.

13

Re: Поясніть за стрімрідери

koala написав:
BufferedStream bs=new BufferedStream(new NetworkStream(globalConnection.s)));
BinaryWriter toServer=new BinaryWriter(bs);

Так не пробували? Тепер налаштовуємо BufferedStream так, як нам треба, і пишемо простими Write-ами.

класно так xD але є одне але. Припустим, таким чином я відправляю інформацію про персонажа, а це буде нік і id. Нік може складатись від 3 до 20 символів. Як на іншій стороні правильно обробити ці дані? нам же прийшов просто шматок даних, ми можимо лише вірно прийняти команду, котра записується першою і лежить з 0 по 2 індекси буффера, а далі вже хз, адже довжина ніку це поняття гумове таке.

14

Re: Поясніть за стрімрідери

Так для цього і придумали рідери. Хай в BinaryReader.ReadString голова за це болить (а насправді просто байт 0 в кінці рядка буде), нащо велосипед винаходити?

15

Re: Поясніть за стрімрідери

koala написав:

Так для цього і придумали рідери. Хай в BinaryReader.ReadString голова за це болить (а насправді просто байт 0 в кінці рядка буде), нащо велосипед винаходити?

а як на сервері дізнатись, що нам прийшли дані? а-то ось така штука не працює

 static  void ReceiveCallback(IAsyncResult ar)
        {
            Socket s = (Socket) ar.AsyncState;
            try
            {
               
                int n = s.EndReceive(ar);
                Console.WriteLine("пришло "+n+" байт");
                BinaryReader toServer = new BinaryReader(new NetworkStream(s));

                string i = toServer.ReadString();
                    Console.WriteLine(i);
                

                s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), s);

                Console.WriteLine(BitConverter.ToInt32(buff,0));
            }
            catch (Exception e)
            {
                
                Console.WriteLine(e.Message);
            }
        }

16

Re: Поясніть за стрімрідери

всьо пучком. чутка погуглив і знайшов рішення

 static  void ReceiveCallback(IAsyncResult ar)
        {
            Socket s = (Socket) ar.AsyncState;
            try
            {

                int n = s.EndReceive(ar);
                Console.WriteLine("пришло " + n + " байт");
                if (n > 0)
                {
                
                MemoryStream ms = new MemoryStream(buff);
                BinaryReader br = new BinaryReader(ms);
                Console.WriteLine("got one " + br.ReadString());

            }

            s.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), s);

                
            }
            catch (Exception e)
            {
                
                Console.WriteLine(e.Message);
            }
        }
Подякували: koala1