У меня огромная проблема.Попытка создать приложение, которое должно состоять из двух частей: серверной и клиентской.Эти две части должны как-то общаться и обмениваться объектами.Я решил использовать сокеты, потому что я не знаком с WCF и могу тестировать обе части на одном компьютере (просто поместите их для прослушивания по адресу 127.0.0.1).
Теперь, когда я пытаюсь отправитьнекоторый "пользовательский" сериализуемый объект от клиента я получил исключение "OutOfMemory" на стороне сервера!Я читал о Sockets, способах отправки / получения объектов, я пробовал какой-то код, который нашел в сети, но не повезло!Я понятия не имею, что не так с моим кодом.Вот мой код:
Это тестовый класс, определенный в коде обеих сторон:
[Serializable]
class MyClass
{
public string msg="default";
}
Код отправки на стороне клиента (работает нормально):
private void cmdSendData_Click(object sender, System.EventArgs e)
{
try
{
MyClass test = new MyClass();
NetworkStream ns = new NetworkStream(m_socWorker); //m_socWorker is socket
BinaryWriter bw = new BinaryWriter(ns);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, test);
bw.Write(ms.ToArray());
MessageBox.Show("Length is: " + ms.ToArray().Length); //length is 152!
ns.Close();
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
}
Серверкод стороны (тот, который вызывает проблемы):
public void OnDataReceived(IAsyncResult asyn)
{
try
{
CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState ;
NetworkStream ns = new NetworkStream(m_socWorker);
byte[] buffer = new byte[1024];
ns.Read(buffer, 0, buffer.Length);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream mem = new MemoryStream(buffer.Length);
mem.Write(buffer, 0, buffer.Length);
mem.Seek(0, SeekOrigin.Begin);
MyClass tst = (MyClass)bin.Deserialize(mem); //ERROR IS THROWN HERE!
MessageBox.Show(tst.msg);
theSockId.thisSocket.EndReceive(asyn);
WaitForData(m_socWorker);
}
catch (ObjectDisposedException )
{
System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
}
catch(SocketException se)
{
MessageBox.Show (se.Message );
}
}
Итак, я получил исключение при попытке десериализации.Понятия не имею, что не так.
Я угрожал своему коду: «Если вы будете продолжать вызывать проблемы, я сообщу вам о парнях из StackOverflow», так что вот я:)