У меня проблемы с отправкой сериализованных данных через сокет TCP / IP.
Моя функция отправки выглядит следующим образом:
public void SendData(NetworkConnection connection, ReplicableObject ro) {
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, ro);
ms.WriteTo(connection.TcpStream);
connection.TcpStream.Flush();
ms.Close();
}
Я знаю, что в настоящее время TcpStream.Flush () ничего не делает. Во всяком случае, это не моя проблема.
На принимающей (клиентской) стороне читатель выглядит так:
byte[] readBuffer = new byte[8192];
worldMapStream = worldMapConnection.GetStream();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
IsConnectedToWorldMap = true;
while (true) {
try {
do {
int bytes = worldMapStream.Read(readBuffer, 0, readBuffer.Length);
ms.Write(readBuffer, 0, bytes);
}
while (worldMapStream.DataAvailable);
try {
ReplicableObject ro = (ReplicableObject) bf.Deserialize(ms);
ro = ro;
}
catch (Exception e) {
e = e;
}
}
Странные строки ro = ro и e = e как раз для того, чтобы я мог добавить точку останова.
Моя проблема заключается в следующем: чтение всегда заканчивается неудачей. Я получаю исключение, и сообщение объясняет, что конец потока был достигнут до того, как анализ был завершен. Теперь я понимаю, что не все данные могут поступать в одном блоке, но я не очистил поток памяти при перехвате исключения, поэтому следующий блок должен просто добавить оставшиеся данные в конец, верно? Но, похоже, это не работает.
Итак, что я делаю не так? Заранее спасибо. :)
P.S. Я понимаю, что WCF - лучшая альтернатива этому; но, к сожалению, я не могу использовать это в этом проекте.