Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过网络发送对象_C#_Sockets_Networking_Serialization - Fatal编程技术网

C# 通过网络发送对象

C# 通过网络发送对象,c#,sockets,networking,serialization,C#,Sockets,Networking,Serialization,我正在尝试创建一个C#应用程序,它有两个部分——服务器和客户端。客户机需要通过网络与服务器通信(测试时,两个部分都在本地计算机上通过“127.0.0.1”进行通信)。我曾尝试将套接字与序列化结合起来,但没有成功 我尝试序列化并发送简单(测试)对象,如下所示: [Serializable] class Test { public string msg="default"; } try { Test tst = new Test(); tst.msg = "TEST";

我正在尝试创建一个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 );
    }
}
此类在服务器和客户端代码中都定义

发送代码如下所示:

[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 );
    }
}
接收代码如下所示:

[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'的异常。”

指向“反序列化”行


我的代码中是否有明显的问题?

我建议简化测试代码:

  • 使用一个简单的字符串测试您的网络套接字代码(首先从混合中消除序列化以验证这一点)

  • 直接测试序列化/反序列化代码(无需网络套接字的额外复杂性)

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


  • 运气好

    嗯……我不熟悉WFC,从未使用过它:\n这就是为什么我在序列化/反序列化字符串时没有使用它,我得到了“对象无映射”异常:\n好的,字符串不是大问题,但自定义对象?:DCustom对象也不例外。您仍然只是发送一个字节数组。。。现在您只需要了解序列化/反序列化:-)