Отправка объектов по сети - PullRequest
0 голосов
/ 23 июня 2011

Я пытаюсь создать приложение на C #, которое состоит из двух частей - сервера и клиента. Клиенту необходимо взаимодействовать с сервером по сети (при тестировании обе части будут находиться на локальном компьютере, общаясь через «127.0.0.1»). Я пытался объединить сокеты с сериализацией, но безуспешно.

Я пытаюсь сериализовать и отправить простой (тестовый) объект следующим образом:

[Serializable]
class Test
{
    public string msg="default";
}

Этот класс определяется как на сервере, так и в коде клиента.

Отправка кода выглядит следующим образом:

try
{
    Test tst = new Test();
    tst.msg = "TEST";

    NetworkStream ns = new NetworkStream(m_socWorker);
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();

    bf.Serialize(ms, tst);

    m_socWorker.Send(ms.ToArray());
}
catch(System.Net.Sockets.SocketException se)
{
    MessageBox.Show (se.Message );
}

Получение кода выглядит так:

public  void OnDataReceived(IAsyncResult asyn)
{
    try
    {
         CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
         //end receive...

         Test tst;
         byte[] buffer = new byte[1024];
         m_socWorker.Receive(buffer);

         BinaryFormatter bin = new BinaryFormatter();
         MemoryStream mem = new MemoryStream(buffer);

         tst = (Test)bin.Deserialize(mem);
         txtDataRx.Text = tst.msg;
         theSockId.thisSocket.EndReceive(asyn);
    }
    catch (ObjectDisposedException)
    {
         System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
    }
    catch(SocketException se)
    {
         MessageBox.Show (se.Message );
    }
}

При отправке данных я получаю исключение -

«Исключение типа« System.OutOfMemoryException »было сгенерировано».

указывает на строку "Десериализация".

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

1 Ответ

1 голос
/ 23 июня 2011

Я бы предложил упростить ваш код для тестирования:

  1. Проверьте код сетевых сокетов, используя простую строку (исключите сериализацию из микса, чтобы сначала проверить это).

  2. Проверьте ваш код сериализации / десериализации напрямую (без дополнительной сложности сетевых сокетов).

  3. Как только вы лучше разберетесь в обеих частях по отдельности, вы можете приступить к их объединению ...

Удача

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