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 وجود نداره درحالی که وقتی بدون سوکت امتحان میکنم درسته و کار هم میکنه.
کسی نظری نداره مشکل از کجاست؟
کلاس زیر رو برای دریافت داده نوشتم که توی یک قسمتی داده رو اول دی سریالیز میکنه بعد به کلاس متناظر میبره و از متد های کلاس استفاده میکنه :
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 وجود نداره درحالی که وقتی بدون سوکت امتحان میکنم درسته و کار هم میکنه.
کسی نظری نداره مشکل از کجاست؟