Первая проблема, которую я вижу, заключается в том, что вы игнорируете readByteCount
(который фактически является числом символов, а не числом байтов);Вы должны использовать:
string code = new string(buff, 0, readByteCount);
Однако следующая проблема, которую я вижу, заключается в том, что у вас нет протокола кадрирования.Это означает:
- если два сообщения отправляются близко друг к другу, вы можете получить то, что выглядит как одно объединенное значение
- , даже отдельные значения могут быть произвольно усечены, так как они разделяются между пакетами
- и т. Д.
В любом случае:
- если сообщение длиннее длины вашего буфера, вы прервитесь
- , есливы когда-либо получаете более одного сообщения за раз, вы сломаны
, так как в любом случае, никогда не будет возможности правильно восстановить позицию.Отсюда: кадры, где каждый кадр представляет собой законченное сообщение.
Общий подход к текстовым протоколам заключается в использовании новой строки в качестве кадра (я позволю вам решить, означает ли это CR, LF, CRLF,так далее);тогда вы можете просто использовать ReadLine
/ ReadLineAsync
для чтения текста, и он будет делать все автоматически , поэтому:
string code = await clientStreamReader.ReadLineAsync();
if (code is null)
{
Console.WriteLine("Disconnected from server.");
client.Close();
}
else
{
ProcessServerCode(code);
}