у меня есть простой вопрос относительно порядка отправленных и полученных сообщений через классы TCP, я не могу найти 100% ответ, и мой английский не достаточно хорош.
Если у меня есть следующий пример:
Сервер:
IPAddress IP = IPAddress.Parse("127.0.0.1");
int Port = 13000;
TcpListener Server = new TcpListener(IP, Port);
TcpClient Client = Server.AcceptTcpClient();
NetworkStream Stream = Client.GetStream();
Stream.Write(Buffer1, 0, 4);
//random time
Stream.Write(Buffer2, 0, 4);
//random time
Stream.Write(Buffer3, 0, 4);
и Клиент:
TCPClient Client = new TcpClient("127.0.0.1", 13000);
NetworkStream Stream = Client.GetStream();
Stream.Read(A, 0, 4);
//random time
Stream.Read(B, 0, 4);
//random time
Stream.Read(C, 0, 4);
Уверен ли я на 100%, что я получу A = Buffer1, B = Buffer2, C = Buffer3?
Stream.Read
, чтобы увидеть, сколько байтов вы на самом деле получили. TCP является упорядоченным (это означает, что вы гарантированно получите байты в том порядке, в котором вы их отправили), но также и потоковым (это означает, что пакетирование байтов не гарантируется). Чтобы сделать это более явным: TCP не имеет сообщений. Если вам нужны сообщения, вам придется создавать их самостоятельно (наиболее распространенным подходом является префикс длины). Обратитесь к любому учебнику по сетевому коду, чтобы узнать, как написать правильный цикл приема. - person Jeroen Mostert   schedule 25.11.2016Stream.Read
будет читать доступные байты. Он не будет ждать, пока будет доступно столько байтов, сколько вы укажете. Именно поэтому он в первую очередь возвращает количество прочитанных байтов — иначе в этом не было бы необходимости. - person Jeroen Mostert   schedule 25.11.2016BinaryReader
, который выполняет буферизацию.Stream
нет. - person Jeroen Mostert   schedule 25.11.2016BinaryReader
. Спасибо что подметил это! - person George Chondrompilas   schedule 25.11.2016BinaryReader
для удобства, потому что он буферизует для вас - читайте длину, а затем полное сообщение. Таким образом, вам не нужен собственный цикл. Но если вы используетеNetworkStream
напрямую, вы должны зацикливаться, даже чтобы прочитать только первые 4 байта. - person Jeroen Mostert   schedule 25.11.2016BinaryReader(Stream)
, а затем я смогу легко использоватьBinaryReader.Read
вместоNetworkStream.Read
для чтения, верно? - person Erik Šťastný   schedule 28.11.2016BinaryReader.Read (Byte[], Int32, Int32)
: количество байтов, прочитанных в буфер. Это может быть меньше запрошенного количества байтов, если такое количество байтов недоступно, или может быть равно нулю, если достигнут конец потока. - person Erik Šťastný   schedule 28.11.2016