我正在尝试创建一个包含两个部分的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'类型的异常。”
指向“反序列化”行。
我的代码中是否有明显的问题导致问题?
答案 0 :(得分:1)
我建议简化您的测试代码:
使用简单的字符串测试您的网络套接字代码(从混合中删除序列化以首先验证它。)
直接测试序列化/反序列化代码(没有网络套接字的额外复杂性)。
一旦你对这两个部分有了更好的理解,那么你就可以开始把它们放在一起......
福