通过网络发送对象

时间:2011-06-23 13:22:08

标签: c# sockets networking serialization

我正在尝试创建一个包含两个部分的C#应用​​程序 - 服务器和客户端。客户端需要通过网络与服务器通信(测试时,两个部分都在本地计算机上通过“127.0.0.1”进行通信)。我试图将Sockets与序列化相结合,但没有运气。

我正在尝试序列化并发送像这​​样的简单(测试)对象:

[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 个答案:

答案 0 :(得分:1)

我建议简化您的测试代码:

  1. 使用简单的字符串测试您的网络套接字代码(从混合中删除序列化以首先验证它。)

  2. 直接测试序列化/反序列化代码(没有网络套接字的额外复杂性)。

  3. 一旦你对这两个部分有了更好的理解,那么你就可以开始把它们放在一起......