лучший способ отправлять и получать несколько переменных данных через сокет

1

Я работаю над игровым проектом, который использует сокеты для отправки и получения данных. Клиентские игры Unity, сервер ASP.Net.

Как мы все знаем в сокетах, вы можете отправлять и получать байты. Итак, что является лучшим способом для меня отправлять и получать несколько переменных, таких как направление скорости и так далее.

Я думаю, что лучший способ - перевести все переменные в строку и преобразовать эту строку в байт, а после этого отправить и un concat строку с другой стороны. Но, возможно, это не самый лучший способ, и могут быть другие способы, особенно в С#. Вот мой псевдокод, который, я думаю, может хорошо работать:

 int position,rotation;
 string data=concat(data,position,rotation);
 byte[] byteBuffer = Encoding.ASCII.GetBytes(data);
 socket.send(bytebuffer);

Я думаю, что этот способ не может быть достаточно эффективным. Могу ли я найти другой способ?

  • 0
    Shotgunning для помощи?
  • 0
    что это значит? @TyCobb
Показать ещё 1 комментарий
Теги:
sockets

2 ответа

2
Лучший ответ

Нет смысла возиться со строками, если вам не нужна строка.

BinaryWriter этого вы можете использовать BinaryReader и BinaryWriter. Таким образом, вы сохраняете свой размер полезной нагрузки до минимума, и вам не нужно иметь дело с строковыми кодировками (если не писать и читать фактическую строку, конечно).

// Client
using(var ms = new MemoryStream())
{
   using (var writer = new BinaryWriter(ms))
   {
       //writes 8 bytes
       writer.Write(myDouble);

       //writes 4 bytes
       writer.Write(myInteger);

       //writes 4 bytes
       writer.Write(myOtherInteger);
   }    
   //The memory stream will now have all the bytes (16) you need to send to the server
}

// Server
using (var reader = new BinaryReader(yourStreamThatHasTheBytes))
{
    //Make sure you read in the same order it was written....

    //reads 8 bytes
    var myDouble = reader.ReadDouble();

    //reads 4 bytes
    var myInteger = reader.ReadInt32();

    //reads 4 bytes
    var myOtherInteger = reader.ReadInt32();
}

Я думаю, что этот способ не может быть достаточно эффективным. могу я найти другой путь? [Так в оригинале]

Тебе не стоит об этом беспокоиться. Похоже, вы все еще на первых этапах проекта. Я рекомендую только что-то начать работать, но стараюсь, чтобы вы сделали его подключаемым. Таким образом, вы можете легко поменять его позже, если считаете, что решение у вас слишком медленное или вы решили использовать что-то другое вместо сокета.

  • 0
    спасибо, это хороший ответ, но, как я понял из вашего ответа, вы можете сопоставить переменные по их типам данных. но что, если некоторые из них такие же, как они оба int.
  • 1
    @virtouso, каждый тип данных имеет фиксированную длину. int 4 байта. Таким образом, если у вас есть 2 дюйма (8 байт), вы бы вызывали ReadInt32() дважды. Каждый раз, когда вы вызываете метод Read, он считывает определенное количество байтов в зависимости от типа данных.
1

спасибо моим друзьям, но я нашел гораздо более простой способ и решил поделиться этим с вами. Вы можете просто установить некоторые varibales в строку, после чего вы можете разделить это, чтобы читать их отдельно. как код ниже:

string s = "first,second,x";
 string[] s2=s.Split(',');
 Console.WriteLine(s2[0]);
 Console.ReadLine();

Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню