PDA

View Full Version : Socket And Serialize



Saman_12
چهارشنبه 15 بهمن 1393, 21:35 عصر
سلام دارم روی یک کلاس برای استفاده راحت تر از سوکت کار میکنم ... (اگر تموم شد و کار کرد آپ میکنم برا تون)
کلاس زیر رو برای دریافت داده نوشتم که توی یک قسمتی داده رو اول دی سریالیز میکنه بعد به کلاس متناظر میبره و از متد های کلاس استفاده میکنه :

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;


public class SocketListener
{


[Serializable()]
private class SocketState
{


public object Header { get; set; }
public byte[] Data { get; set; }




public SocketState(object header, byte[] data)
{
this.Header = header;
this.Data = data;
}
}


public IPAddress IP { get; set; }
public Int32 Port { get; set; }
public Socket Listener { get; set; }
public bool DoAccept { get; set; }
public bool DoReceive { get; set; }
private bool _isreceive;
public bool IsReceive
{
get { return _isreceive; }
}


public event ReceiverEventHandler Receiver;
public delegate void ReceiverEventHandler(SocketListener listener, Socket accepted, object header, byte[] data);
public event AccepterEventHandler Accepter;
public delegate void AccepterEventHandler(SocketListener listener, Socket accepted);




public SocketListener(IPAddress ip, Int32 port, ProtocolType type)
{
this.IP = ip;
this.Port = port;
this.Listener = new Socket(ip.AddressFamily, SocketType.Stream, type);
}




public void StartAccepter()
{
Listener.Bind(new IPEndPoint(IP, Port));
Listener.Listen(0);


DoAccept = true;


Thread t = new Thread(t_accepter);


t.IsBackground = true;
t.Priority = ThreadPriority.Lowest;
t.Start();
}




private void t_accepter()
{


while (DoAccept)
{
Socket acpskt = Listener.Accept();
if (Accepter != null)
{
Accepter(this, acpskt);
}
}
}


public bool StartReceiver(Socket acpskt)
{


if (acpskt.Connected)
{


if (IsReceive == false)
{
DoReceive = true;


Thread t = new Thread(t_receiver);


t.IsBackground = true;
t.Priority = ThreadPriority.Lowest;
t.Start(acpskt);


return true;


}
else
{
return false;
}


}
else
{
return false;
}
}




private void t_receiver(object arg)
{
_isreceive = true;


Socket acpskt = (Socket)arg;


while (DoReceive)
{


if (acpskt.Connected)
{
BinaryFormatter fr = new BinaryFormatter();
SocketState ss = null;


using (MemoryStream ms = new MemoryStream())
{


do
{
byte[] buffer = new byte[1024];
Int32 result = acpskt.Receive(buffer);




if (result == 1024)
{
ms.Write(buffer, 0, 1024);


}
else
{
ms.Write(buffer, 0, result);
break;
}
} while (true);


using (MemoryStream serializedms = new MemoryStream(ms.GetBuffer()))
{

ss = (SocketState)fr.Deserialize(serializedms);
}
}


if (Receiver != null)
{
Receiver(this, acpskt, ss.Header, ss.Data);
}
}
}


_isreceive = false;
}
}




کلاس زیر هم برای فرستادنه سریالیز هم میکنه :

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;


public class SocketSender
{


[Serializable()]
private class SocketState
{


public object Header { get; set; }
public byte[] Data { get; set; }




public SocketState(object header, byte[] data)
{
this.Header = header;
this.Data = data;
}
}


public IPAddress IP { get; set; }
public Int32 Port { get; set; }
public Socket Client { get; set; }




public SocketSender(IPAddress ip, Int32 port, ProtocolType type)
{
this.IP = ip;
this.Port = port;
this.Client = new Socket(ip.AddressFamily, SocketType.Stream, type);
}




public void Connect()
{
Client.Connect(new IPEndPoint(IP, Port));
}




public void Send(object header, byte[] data)
{
BinaryFormatter fr = new BinaryFormatter();


using (MemoryStream ms = new MemoryStream()) {


SocketState ss = new SocketState(header, data);


fr.Serialize(ms, ss);


Client.Send(ms.GetBuffer());
}
}
}




ولی تو کلاس سمت سرور -SocketListener- به خط fr.Deserialize خطا میگیره میگه که Assembly وجود نداره درحالی که وقتی بدون سوکت امتحان میکنم درسته و کار هم میکنه.
کسی نظری نداره مشکل از کجاست؟

Saman_12
پنج شنبه 16 بهمن 1393, 00:06 صبح
حل شد.
وقتی کلاسی سریالیز میشه فضای نام اون کلاس هم ثبت میشه موقع دی سریالیز کردن اون فضای نام حتما باید وجود داشته باشه.
(کلاس رو حذف کردم و به صورت آبجکت فرستادم)