[C# 1.1] - Event & Thread
RBonjour à tous.
J'ai dois concevoir un petit serveur TCP/IP multi-thread. Voilà le début :
Code:
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
|
public class TCPServer
{
// Déclaration des délégés
public delegate void ClientConnected( int iClientID );
public delegate void ClientDisconnected( int iClientID );
public delegate void ClientErrorOccured( int iClientID, Exception e );
public delegate void ClientDataReceived( int iClientID, byte[] data );
// Déclaration des événements
public event ClientConnected OnClientConnected;
public event ClientDisconnected OnClientDisconnected;
public event ClientErrorOccured OnClientErrorOccured;
public event ClientDataReceived OnClientDataReceived;
// Déclaration des membres privés
private string m_IPAddress = "127.0.0.1";
private int m_PortNumber = 2222;
private bool m_bIsRunning = false;
private TcpListener m_TCPListener = null;
// ...
// Événements par défaut
private void ClientConnectedEvent( int iClientID )
{
if (OnClientConnected != null)
OnClientConnected( iClientID );
}
private void ClientDataReceivedEvent( int iClientID, byte[] data )
{
if (OnClientDataReceived != null)
OnClientDataReceived( iClientID, data );
}
// ...
// Constructeur
public TCPServer( string ipAddress, int iPortNumber )
{
m_PortNumber = iPortNumber;
m_IPAddress = ipAddress;
}
// Démarrage du server
public void Start()
{
Thread serverThread = new Thread( new ThreadStart( Listen ) );
serverThread.Start();
}
// Main loop du serveur
private void Listen()
{
m_bIsRunning = true;
m_TCPListener = new TcpListener( System.Net.IPAddress.Parse(m_IPAddress), m_PortNumber );
m_TCPListener.Start();
while( m_bIsRunning )
{
// Waiting for a connection
Socket clientSocket = null;
try
{
clientSocket = m_TCPListener.AcceptSocket();
}
catch (SocketException se )
{
ClientErrorOccuredEvent( -1, se );
continue;
}
// Client connecté
if (clientSocket.Connected)
{
m_ClientID++;
// Déclancher l'événement de connection
ClientConnectedEvent( newClientID );
// Créer un object ServerClientThread
ServerClientThread sct = new ServerClientThread( newClientID, clientSocket );
// Démarage du nouveau processus (gestion du client connecté)
Thread serverThread = new Thread( new ThreadStart( sct.Process ) );
serverThread.Start();
// ...
}
// ...
}
}
} |
Maintenant voici la classe Wrapper ServerClientThread :
Code:
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
|
public class ServerClientThread
{
// Déclaration des membres privés
private bool m_bStopProcess = false;
// ...
// Constructeur
public ServerClientThread( int iClientID, Socket clientSocket )
{
m_ClientID = iClientID;
m_ClientSocket = clientSocket;
}
// Point d'entré du thread
public void Process()
{
while (!m_bStopProcess)
{
// À partir d'ici je créer un NetworkStream et j'attend les
entrées de donnée. Cependant, comment puis-je déclancher l'événement
ClientDataReceived de la classe TCPServer qui à
démarré ce thread ? Sous C++ j'aurais déclarer cette classe comme étant
FRIEND mais en c# ???
}
}
} |
Alors voilà, je crois bien que ma question est claire ;)
Merci pour votre aide.