Исключение программирования на сокете В XML-документе есть ошибка (170, 46) - PullRequest
0 голосов
/ 11 ноября 2011

Я хочу отправить список объектов через сокетное соединение.И я знаю, что сервис WCF будет лучшим вариантом, но для меня это не вариант.

Я использую этот код для отправки данных

    private void tm_Tick(object sender, EventArgs e)
    {

        XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));

        MemoryStream stream = new MemoryStream(1024);

        formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);

        byte[] bt = stream.ToArray();
        foreach (Communication.Client Client in server.ClientList)
        {
            Client.SendMessage(bt);

        }
        stream.Flush();
    }

    public void SendMessage(Byte[] bytesSent)
    {
        SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
        writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
        socket.SendAsync(writeEventArgs);
    }

Кажется, что работает нормально.

для получения данных я использую этот код в потоке.

void ReceiveData()
    {
        try
        {

            while (true)
            {
                if (disposed == true)
                    return;
                data = new byte[socket.ReceiveBufferSize];
                var recv = socket.Receive(data);

                XmlSerializer formatter = new XmlSerializer(typeof(List<Object.PIP>));
                MemoryStream stream = new MemoryStream(data);
                **Classes.TickerInformation.PIPList= (List<Object.PIP>)formatter.Deserialize(stream);**

            }
            socket.Close();
            return;
        }
        catch (Exception ex)
        {

        }

    }

Я получаю исключение Ошибка в XML-документе (170, 46).в этой строке: Classes.TickerInformation.PIPList = (List) formatter.Deserialize (stream);

Я предполагаю, что все данные не принимаются, поэтому это происходит.

1 Ответ

2 голосов
/ 11 ноября 2011

Проблема в том, что вы не получили весь XML до конца - поэтому вы сериализуете только начальную часть XML.Вы должны читать из сокета, пока нет данных.

Я предлагаю настроить строку терминатора, отправляемую клиентом, чтобы вы искали ее, чтобы знать, что вы полностью получили сообщение.

Имейте в виду, сокеты не основаны на запросе-ответе. Вы открываете сокет и продолжаете читать.

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