Я пытаюсь отправить несколько разных объектов (ну, это одинаковые типы объектов, только с разными значениями) из одного сокета в другой.Я могу просто отправить один объект, используя следующий код:
Клиент:
var buffer = new byte[1024];
var binFormatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
int bytesRead;
while ((bytesRead = _clientReceive.Receive(buffer)) > 0);
{
ms.Write(buffer, 0, bytesRead);
}
ms.Position = 0;
message = (Message)binFormatter.Deserialize(ms);
}
сервер:
var gm = new Message { Message = "ObjectType", Object = Data };
using (var mem = new MemoryStream())
{
var binFormatter = new BinaryFormatter();
binFormatter.Serialize(mem, gm);
var gmData = mem.ToArray();
client.Send(gmData, gmData.Length, SocketFlags.None);
client.Close();
}
, но если я хочу отправить несколько сообщений (поставьтеполный код клиента в цикле, а не вызов client.Close()
), как я могу определить, когда клиент получил полный объект?Поместив код клиента в такой цикл:
while (_isReceivingStarted)
{
var buffer = new byte[1024];
var binFormatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
int bytesRead;
while ((bytesRead = _clientReceive.Receive(buffer)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
ms.Position = 0;
message = (Message) binFormatter.Deserialize(ms);
}
// Do stuff then wait for new message
}
клиент будет зависать на _clientReceive.Receive(buffer)
, потому что он не получает Close () от клиента и никогда не получает 0 полученных байтов.Если я закрою соединение на сервере, оно будет зациклено, а затем произойдет ошибка в Deserialize MemoryStream вместо блокировки в _clientReceive.Receive(buffer)
в ожидании отправки другого объекта.
Надеюсь, это имеет смысл.Есть указатели?