Сокеты C #, отправляющие сериализованные данные - PullRequest
3 голосов
/ 28 июля 2011

У меня проблемы с отправкой сериализованных данных через сокет 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 - лучшая альтернатива этому; но, к сожалению, я не могу использовать это в этом проекте.

1 Ответ

2 голосов
/ 28 июля 2011

Вот и мы:

while (worldMapStream.DataAvailable);

Должно быть:

while(bytes>0);

Что также означает перемещение bytes за пределы цикла.

DataAvailable просто означает «прямо сейчас, в NIC». Он не говорит вам, будет ли больше или нет. Кроме того, вы должны написать , когда bytes>0 тоже; если честно, цикл while здесь проще:)

Тогда; после заполнения ms установите ms.Position = 0 для перемотки потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...