1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using ApplicationLibrary.Exceptions;
using System.Windows.Forms;
namespace ApplicationLibrary.Bean
{
public class BeanReceiverUtil<T> where T : AbstractBean, new()
{
/// <summary>
/// Cette propriété permet de contrôler l'exécution du thread.
/// </summary>
ManualResetEvent _allDone = new ManualResetEvent(false);
/// <summary>
/// Cette propriété permet de définir le port sur lequel l'on va recevoir le bean.
/// Par défaut 1440.
/// </summary>
private int _port = 1440;
/// <summary>
/// Cette propriété définit a true permet de continuer a écouter,
/// et si elle est définit a false arrête le "thread",
/// et empêche même sont redémarrage.
/// </summary>
private bool _listenStartStop = true;
/// <summary>
/// Cette propriété définit
/// le nombre maximum de la liste d'attente du socket d'écoute par défaut a 10.
/// </summary>
private int _backlog = 10;
/// <summary>
/// Constructeur par défaut
/// </summary>
public BeanReceiverUtil()
{
}
/// <summary>
/// Contructeur pour la définition du bean qui sera reçu.
/// </summary>
/// <param name="objectReceived"></param>
public BeanReceiverUtil(ref T receiveObject)
{
ReceiveObject = receiveObject;
}
/// <summary>
/// Cette méthode va permettre de définir par référence le bean a envoyer.
/// </summary>
/// <param name="objectToSend"> </param>
public void SetBeanToReceiveTheRefWay(ref T receiveObject)
{
ReceiveObject = receiveObject;
}
/// <summary>
/// Démarre un serveur qui écoute les connexions.
/// </summary>
public void Start()
{
try
{
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Loopback, _port));
while (ListenStartStop)
{
_allDone.Reset();
listener.Listen(Backlog);
listener.BeginAccept(Accept, listener);
_allDone.WaitOne(); //halts this thread
}
}
catch (SocketException se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Start : Une erreur réseau est survenue");
}
catch (Exception se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Start : Une erreur est survenue");
}
}
/// <summary>
/// Démarre quand une connexion entrante a été demandé,
/// implicitement cela démarre un thread pour gérer la connexion.
/// </summary>
public void Accept(IAsyncResult result)
{
try
{
T obj = new T();
obj.Socket = ((Socket)result.AsyncState).EndAccept(result);
obj.Socket.BeginReceive(obj.buffer, 0, obj.buffer.Length, SocketFlags.None, Receive, obj);
}
catch (SocketException se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Accept : Une erreur réseau est survenue");
}
catch (Exception se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Accept : Une erreur est survenue");
}
}
/// <summary>
/// Reçoit les données, les met dans une mémoire tampon et vérifie si il est nécessaire de recevoir à nouveau.
/// </summary>
public void Receive(IAsyncResult result)
{
try
{
T obj = (T)result.AsyncState;
int read = obj.Socket.EndReceive(result);
if (read > 0)
{
for (int i = 0; i < read; i++)
{
obj.TransmissionBuffer.Add(obj.buffer[i]);
}
//we need to read again if this is true
if (read == obj.buffer.Length)
{
obj.Socket.BeginReceive(obj.buffer, 0, obj.buffer.Length, SocketFlags.None, Receive, obj);
}
else
{
Done(obj);
}
}
else
{
Done(obj);
}
}
catch (SocketException se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Receive : Une erreur réseau est survenue");
}
catch (Exception se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Receive : Une erreur est survenue");
}
}
/// <summary>
/// Deserializes and outputs the received object
/// </summary>
public void Done(T obj)
{
try
{
ReceiveObject.SetValue(obj.DeSerialize<T>());
_allDone.Set(); //signals thread to continue
//So it jumps back to the first while loop and starts waiting for a connection again.
}
catch (SocketException se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Done: Une erreur réseau est survenue");
}
catch (Exception se)
{
MessageBox.Show(se.Message.ToString(), "Receiver Done: Une erreur est survenue");
}
}
public int Backlog
{
get
{
return _backlog;
}
set
{
_backlog = value;
}
}
public bool ListenStartStop
{
get
{
return _listenStartStop;
}
set
{
_listenStartStop = value;
}
}
public int Port
{
get
{
return _port;
}
set
{
_port = value;
}
}
public T ReceiveObject { get; set; }
}
} |
Partager