Imam veliki problem. Pravim aplikaciju koja treba da se sastoji od serveskog i klijentskog dela. Ta dva dela trebaju da komuniciraju nekako, da razmenjuju objekte. Odlucio sam se da koristim socket-e zato sto sam ih i ranije koristio i zato sto mogu bez problema da testiram aplikaciju na svom kompu (pokrenem i serverski i klijentski deo i dam im da slusaju port na 127.0.0.1).
E sad, kada sa sa klijentskog dela pokusam da serverskom delu prosledim neki "custom" objekat (koji moze da se serijalizuje, naravno), na serverskom delu dobijem "OutOfMemory" gresku! Citao sam clanke na drugim sajtovima, kopirao kod, ali nikako mi nije jasno gde gresim.
Test klasa koja je definisana i u klijentskom i u serverskom kodu:
kod za slanje (nalazi se u klijentskom delu programa):
gornji kod radi bez problema. Kod serverskog dela za prijem podataka (kod koji i pravi probleme):
Greska se javlja prilikom pokusaja deserijalizacije. Gde gresim? Gde je problem u kodu?
E sad, kada sa sa klijentskog dela pokusam da serverskom delu prosledim neki "custom" objekat (koji moze da se serijalizuje, naravno), na serverskom delu dobijem "OutOfMemory" gresku! Citao sam clanke na drugim sajtovima, kopirao kod, ali nikako mi nije jasno gde gresim.
Test klasa koja je definisana i u klijentskom i u serverskom kodu:
Code:
[Serializable]
class Boza
{
public string poruka="default";
}
[Serializable]
class Boza
{
public string poruka="default";
}
kod za slanje (nalazi se u klijentskom delu programa):
Code:
private void cmdSendData_Click(object sender, System.EventArgs e)
{
try
{
Boza boza = new Boza();
NetworkStream ns = new NetworkStream(m_socWorker); //m_socWorker je Socket
BinaryWriter bw = new BinaryWriter(ns);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, boza);
bw.Write(ms.ToArray());
MessageBox.Show("Duzina: " + ms.ToArray().Length); //duzina je 152!
ns.Close();
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
}
private void cmdSendData_Click(object sender, System.EventArgs e)
{
try
{
Boza boza = new Boza();
NetworkStream ns = new NetworkStream(m_socWorker); //m_socWorker je Socket
BinaryWriter bw = new BinaryWriter(ns);
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, boza);
bw.Write(ms.ToArray());
MessageBox.Show("Duzina: " + ms.ToArray().Length); //duzina je 152!
ns.Close();
}
catch(System.Net.Sockets.SocketException se)
{
MessageBox.Show (se.Message );
}
}
gornji kod radi bez problema. Kod serverskog dela za prijem podataka (kod koji i pravi probleme):
Code:
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);
Boza boz = (Boza)bin.Deserialize(mem); //OVDE SE JAVLJA GRESKA!
MessageBox.Show(boz.poruka);
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 );
}
}
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);
Boza boz = (Boza)bin.Deserialize(mem); //OVDE SE JAVLJA GRESKA!
MessageBox.Show(boz.poruka);
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 );
}
}
Greska se javlja prilikom pokusaja deserijalizacije. Gde gresim? Gde je problem u kodu?