Я потратил довольно много часов, читая на TCP-серверах и желаемом протоколе, который я пытался реализовать, и наконец все получилось отлично.Я заметил, что код выглядит как абсолютные боллосы (это правильное использование? Я не брит), и хотел бы получить некоторые отзывы об его оптимизации, в основном для повторного использования и читабельности.
Форматы пакетов всегда int, int,int, string, string.
try
{
BinaryReader reader = new BinaryReader(clientStream);
int packetsize = reader.ReadInt32();
int requestid = reader.ReadInt32();
int serverdata = reader.ReadInt32();
Console.WriteLine("Packet Size: {0} RequestID: {1} ServerData: {2}", packetsize, requestid, serverdata);
List<byte> str = new List<byte>();
byte nextByte = reader.ReadByte();
while (nextByte != 0)
{
str.Add(nextByte);
nextByte = reader.ReadByte();
}
// Password Sent to be Authenticated
string string1 = Encoding.UTF8.GetString(str.ToArray());
str.Clear();
nextByte = reader.ReadByte();
while (nextByte != 0)
{
str.Add(nextByte);
nextByte = reader.ReadByte();
}
// NULL string
string string2 = Encoding.UTF8.GetString(str.ToArray());
Console.WriteLine("String1: {0} String2: {1}", string1, string2);
// Reply to Authentication Request
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write((int)(1)); // Packet Size
writer.Write((int)(requestid)); // Mirror RequestID if Authenticated, -1 if Failed
byte[] buffer = stream.ToArray();
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
}
Я собираюсь иметь дело и с другими типами пакетов, которые имеют одинаковый формат (int / int / int / str / str), но разные значения.Я мог бы, вероятно, создать класс пакета, но это немного выходит за рамки моих знаний о том, как применить его к этому сценарию.Если это имеет какое-то значение, это протокол, который я реализую.
http://developer.valvesoftware.com/wiki/Source_RCON_Protocol