Я недавно начал работать с TCP в C#. Сейчас я нахожусь в точке, где я хочу, чтобы клиент получил данные, отправленные сервером.
Я знаю, что у клиента нет гарантии на получение всех данных одновременно. Если размер отправляемых данных больше размера буфера на стороне клиента, то данные будут отправлены по частям. Итак, мой вопрос: как я могу сохранить все полученные данные в байтовом массиве, а затем преобразовать их в реальное сообщение, когда все получено?
Я установил размер буфера в 1, чтобы я мог Посмотрите, что происходит, когда все отправленные данные не помещаются в буфер. Вот мои методы, в которых я вызываю stream.BeginRead()
в Client.cs:
// Deliberately setting the buffer size to 1, to simulate what happens when the message doesn't fit in the buffer.
int bufferSize = 1;
byte[] receiveBuffer;
private void ConnectCallback(IAsyncResult result)
{
client.EndConnect(result);
Console.WriteLine("Connected to server.");
stream = client.GetStream();
// At this point, the client is connected, and we're expecting a message: "Welcome!"
receiveBuffer = new byte[bufferSize];
stream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, new AsyncCallback(ReadCallback), stream);
}
private void ReadCallback(IAsyncResult result)
{
int bytesLength = stream.EndRead(result);
// Should be "Welcome!". But of course it's "W", because the bufferSize is 1.
string message = Encoding.UTF8.GetString(receiveBuffer, 0, bytesLength);
Console.WriteLine("Received message: {0}", receivedMessage);
// Reset the buffer and begin reading a new message, which will be "e".
// However, I want the whole message ("Welcome!") in one byte array.
receiveBuffer = new byte[bufferSize];
stream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, ReadCallback, null);
}
Это вывод при отправке сообщения «Добро пожаловать!»:
Connected to server.
Received message: W
Received message: e
Received message: l
Received message: c
Received message: o
Received message: m
Received message: e
Received message: !
Должен ли я временно сохранять данные до тех пор, пока не будет получено все сообщение, а затем преобразовать их в строку?
Последующий вопрос: что делать, если два сообщения отправляются близко друг к другу, например, Welcome!
, а затем What's your name
? Как тогда различить guish два сообщения?