Я работаю над игровым проектом, который использует сокеты для отправки и получения данных. Клиентские игры Unity, сервер ASP.Net.
Как мы все знаем в сокетах, вы можете отправлять и получать байты. Итак, что является лучшим способом для меня отправлять и получать несколько переменных, таких как направление скорости и так далее.
Я думаю, что лучший способ - перевести все переменные в строку и преобразовать эту строку в байт, а после этого отправить и un concat строку с другой стороны. Но, возможно, это не самый лучший способ, и могут быть другие способы, особенно в С#. Вот мой псевдокод, который, я думаю, может хорошо работать:
int position,rotation;
string data=concat(data,position,rotation);
byte[] byteBuffer = Encoding.ASCII.GetBytes(data);
socket.send(bytebuffer);
Я думаю, что этот способ не может быть достаточно эффективным. Могу ли я найти другой способ?
Нет смысла возиться со строками, если вам не нужна строка.
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();
}
Я думаю, что этот способ не может быть достаточно эффективным. могу я найти другой путь? [Так в оригинале]
Тебе не стоит об этом беспокоиться. Похоже, вы все еще на первых этапах проекта. Я рекомендую только что-то начать работать, но стараюсь, чтобы вы сделали его подключаемым. Таким образом, вы можете легко поменять его позже, если считаете, что решение у вас слишком медленное или вы решили использовать что-то другое вместо сокета.
int
4 байта. Таким образом, если у вас есть 2 дюйма (8 байт), вы бы вызывали ReadInt32()
дважды. Каждый раз, когда вы вызываете метод Read, он считывает определенное количество байтов в зависимости от типа данных.
спасибо моим друзьям, но я нашел гораздо более простой способ и решил поделиться этим с вами. Вы можете просто установить некоторые varibales в строку, после чего вы можете разделить это, чтобы читать их отдельно. как код ниже:
string s = "first,second,x";
string[] s2=s.Split(',');
Console.WriteLine(s2[0]);
Console.ReadLine();
Спасибо.