Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > [TCP Sockets] Асинхронный прием данных


Автор: APXEOLOG 21.10.2009, 16:16
День добрый. Пытаюсь переслать сериализованный класс через TCP, но получаю косяки.
Вот код приема данных на сервере:
Код

        [Serializable]
        class GameData
        {
            public GameData()
            {
            }
            public string str;
        }
        
        ...
        
        byte[] byteData;

        private void OnAccept(IAsyncResult ar)
        {
            try
            {
                Socket clientSocket = serverSocket.EndAccept(ar);
                serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
                byteData = new byte[1000];
                clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, 
                    new AsyncCallback(OnReceive), clientSocket);                
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message, "SGSserverTCP", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
        }

        private void OnReceive(IAsyncResult ar)
        {
            try
            {
                Socket clientSocket = (Socket)ar.AsyncState;
                clientSocket.EndReceive(ar);

                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream mst = new MemoryStream(byteData);

                mst.Position = 0;
                GameData rGd = (GameData)bf.Deserialize(mst);

                mst.Close();
                byteData = null;
                txtLog.Text += '\n' + rGd.str;

                GameData msgToSend = new GameData();
                msgToSend.str = "test";

                MemoryStream sGd = new MemoryStream();

                bf.Serialize(sGd, msgToSend);

                clientSocket.BeginSend(sGd.GetBuffer(), 0, sGd.GetBuffer().Length, SocketFlags.None,
                        new AsyncCallback(OnSend), clientSocket);
                sGd.Close();
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message, "SGSserverTCP", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            }
        }


Данные с клиента отправляю путем:
Код

            GameData msgToSend = new GameData();

            msgToSend.str = "starting message";
            BinaryFormatter bf = new BinaryFormatter();
            System.IO.MemoryStream sGd = new System.IO.MemoryStream();
            bf.Serialize(sGd, msgToSend);

            //Send it to the server
            clientSocket.BeginSend(sGd.ToArray(), 0, sGd.ToArray().Length, SocketFlags.None, new AsyncCallback(OnSend), null);
            sGd.Close();


Сервер генерит исключение. В текущим случае - пишет "Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 00 00 00  00 03 00 00 00 00 00 61 73 64  . . ."

В чем косяк?

ЗЫ И еще вопрос, пока не забыл: будет ли byteData[1000] ограничивать размер класса? т.е. если сериализованный класс будет больше 1кб то он не будет обработан полностью?

Автор: APXEOLOG 22.10.2009, 08:16
Выяснил что при сериализации получаю и отправляю 157 байт, а получаю 14 байт, причем отличающихся от посланных...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)