LE CONTROLE dsSOCKET: CREER UNE APPLICATION IRC

Introduction
Commandes du Contrôle
  Commandes de Connexion
  Commandes de Transfère
Exemple d'une Connexion
  Application Cliente
  Application Serveur
Téléchargement

Introduction

dsSocket est un contrôle Winsock (Windows Sockets) puissant qui a été developpé par Dolphin Systems et permet de créer des applications Internet (Client-Serveur).
dsSocket supporte la gestion de réseaux TCP et UDP. Nous verons juste le côté TCP dans cet article.

Ok, ok... la même chanson du précédent article [Intro to dsSocket], si vous ne l'avez pas lu, je vous conseille vivement de le faire. C'est Important :^)

Bien, nous allons voir comment créer une application IRC (de chat). Ceci demande une application Cliente et Une Serveur.

Créez un nouveau projet vb, allez dans Composants (Ctrl+T), cliquez sur parcourir et allez dans le répertoire dans lequel vous avez dézipper vos fichiers .ocx [c'était le fichier dsSocket.zip ], sélectionnez dsSocket32.ocx et cliquez sur OK. De retour à la boîte de dialogue composants, vérifiez que la case "Dolphin Systems dsSocket TCP/IP control" est cochée et cliquez de nouveau sur OK.

Créer une feuille frmClient et une autre frmServeur.

L'initialisation de notre projet est terminé :^), On passe au code !
NOTE: Pour le reste des applications cliente et serveur, seuls les bouts de code essentiels (importants) seront présentés.

Application Cliente

On travaille maintenant avec la feuille frmClient. Ajoutez y ces contrôles:

Type Nom Description
TextBox txtIP Contient l'IP du serveur hôte
TextBox txtPort Le port de communications à utiliser avec le serveur
TextBox txtMsg Affiche les message reçus et l'état de la connexion
TextBox txtTest Zone où frapper le texte à envoyer au serveur
CommandButton cmdSend Bouton qui envoie le message au Serveur
CommandButton cmdConnect Se connecte au serveur

Pensez à mettre la propriété Locked de txtMsg à true, pour empêcher la saisie du texte à l'interier.
Votre application cliente doit maintenant ressemble à ceci:

wsirc1.gif (6016 octets)

Note: Pour un test, le client et le serveur se trouvent sur une même machine ! Donc le client se connecte en utilisant l'IP de la machine où il se trouve.
Passons au code. L'utilisateur choisi un pseudonyme (nickname).

Private Sub Form_Load()
User = InputBox("Donner votre nickname", "Nickname", "Jean")
If User = "" Then User = "Guest1"
'Client et serveur sur la même machine
txtIP = dsSocket1.LocalDotAddr
'Pour un test... Normalement le serveur est
'ouvert 24h/24
frmServeur.Show
End Sub

Quand l'utilisateur clique ensuite sur Connect

Private Sub cmdConnect_Click()
On Error Resume Next
'GESTION D'ERREURS

If cmdConnect.Caption = "&Connecter" Then
    cmdConnect.Caption = "&Déconnecter"
    txtMsg = "|-| Connection au serveur..." & vbCrLf
    dsSocket1.RemoteDotAddr = txtIP '127.0.0.1 pour local
    'dsSocket1.RemoteHost = "irc.ircchat.com"
    ' ou dsSocket1.RemoteHost = "localhost" pour faire des test
    ' Offline
    dsSocket1.RemotePort = txtPort
    'Tout est prêt ? Allez hop !
    dsSocket1.Connect
Else
    cmdConnect.Caption = "&Connecter"
    'Faut déconnecter
    dsSocket1.Close
    txtMsg = txtMsg & "|-| Déconnecté du serveur" & vbCrLf
End If

End Sub

Si on est vraiment connecté, on doit envoyer le nickname de l'utilisateur au serveur.

Private Sub dsSocket1_Connect()
'Evenement déclenché lorsqu'on est connecté
txtMsg = txtMsg & "|-| Connecté au serveur" & vbCrLf
dsSocket1.Send = "/USERNAME " & User
End Sub

S'il y a eu une erreur ou une exeption, alors on ferme la connexion

Private Sub dsSocket1_Exception(ErrorCode As Integer, ErrorDesc As String)
'Y'a une erreur, une exeption ? Pas grave, fermons la
'connection
dsSocket1.Close
cmdConnect.Caption = "&Connecter"
txtMsg = txtMsg & vbCrLf & ErrorDesc & vbCrLf
End Sub

Y'a des données qui arrivent ? l'évènement Receive se déclenche lors de l'arrivée de messages.

Private Sub dsSocket1_Receive(ReceiveData As String)
'Reception d'un message
txtMsg = txtMsg & ReceiveData & vbCrLf
End Sub

Et c'est tout l'essentiel du client...

Application Serveur

On travaille maintenant avec la feuille frmServeur. Ajoutez y ces contrôles:

Type Nom Description
TextBox txtIP Contient l'IP de la machine où se trouve le serveur
TextBox txtPort Le port de communications à utiliser avec les clients
TextBox txtMsg Affiche les message reçus et l'état de la connexion
TextBox txtTest Zone où frapper le texte à envoyer au client
CommandButton cmdSend Bouton qui envoie le message au client
CommandButton cmdSrv Active le serveur

Pensez à mettre la propriété Locked de txtMsg à true, pour empêcher la saisie du texte à l'interier.
Votre application serveur doit maintenant ressemble à ceci:

wsirc2.gif (6940 octets)

Dans cette application, on aura besoin de 2 contrôles dsSocket:
- dsSocket1 pour écouter le port en attente de messages.
- dsSocket2 pour la gestion de la connexion client-serveur
Lorsque dsSocket1 détecte une connexion, il envoie cette connexion à dsSocket2 qui se charge de traiter les messages envoyés au serveur... Cool! Qu'Ils s'entendent bien !

L'administrateur du serveur clique sur Servire pour activer son serveur.

Private Sub cmdsrv_Click()
On Error Resume Next
'GESTION DES ERREURS

If cmdSrv.Caption = "&Servir" Then
    cmdSrv.Caption = "&Stopper le Service"
    txtMsg = "|-| Attente d'une connection..." & vbCrLf
    'Initialisation de dsSocket1
    'dsSocket1 écoute le Port pour voir s'il y a pas
    'de connections
    'et dsSocket2 prend en charge le client lors d'une connection.
   
    'Se connecte au Port de la machine (du serveur)

    dsSocket1.RemoteDotAddr = "0.0.0.0"
    dsSocket1.LocalDotAddr = "0.0.0.0"
    dsSocket1.LocalPort = txtPort
    'Ecoute le Port
    dsSocket1.Listen
Else
    txtMsg = txtMsg & "Serveur En Arrêt." & vbCrLf
    cmdSrv.Caption = "&Servir"
    'Hop! On quitte
    dsSocket1.Close
    dsSocket2.Close
End If
End Sub

Quand un client se connecte au serveur, l'evènement Accept du socket de lecture (socket 2) est déclenché

Private Sub dsSocket1_Accept(SocketID As Integer)
On Error Resume Next
'dsSocket2 Prend en charge la connexion
dsSocket2.Socket = SocketID  'On accepte la connexion
txtMsg = txtMsg & "|-| Chat en service..." & vbCrLf
dsSocket1.Close   'On ferme le socket de lecture
End Sub

On écoute le Port, à l'arrivée de données, l'évènement Receive du socket 2 est déclenché.
La première instruction que le client envoie au serveur est son NickName (via la commande /USERNAME Nickname ), il est envoyé automatiquement.
Les commandes vous permettent de donner des instructions compréhensibles automatiquement par le serveur... ex:
/SERVERNAME pour avoir le nom du serveur...
Il suffit de taper /SERVERNAME dans la zone de texte txtText et et vous recevez en retour le nom du serveur (ici "Serveur Camernet" :^)

Private Sub dsSocket2_Receive(ReceiveData As String)

'GESTION D'INSTRUCTIONS
'NOTE: VOUS POUVEZ AJOUTER VOS PROPRES INSTRUCTIONS
Dim theLen As Long
Dim thePerson As String

If InStr(ReceiveData, "/USERNAME") Then
'On prend le nom du client /USERNAME
'Ex: /USERNAME Nickname
theLen = Len(ReceiveData) - 10  'Taille du nickname
thePerson = Right(ReceiveData, theLen) 'Nom de la personne
User = thePerson
ReceiveData = ""
End If

If InStr(ReceiveData, "/SERVERNAME") Then
'le client demande le nom du serveur
dsSocket2.Send = "|-| ServerName: " & ServName & vbCrLf
ReceiveData = ""
End If

If ReceiveData <> "" Then
txtMsg = txtMsg & ReceiveData & vbCrLf
End If
End Sub

Maintenant il faut envoyer des données au client, l'administrateur du serveur tape du texte dans txtText et clique sur OK.

Private Sub txtText_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then 'ENTER est pressé
Call SendProc
End If
End Sub

Private Sub SendProc()
Dim Paquet As String
If txtText <> "" Then
Paquet = "Server:  " & txtText  'Le serveur Parle :^)
dsSocket2.Send = Paquet  'Envoie le paquet
txtMsg = txtMsg & Paquet & vbCrLf
txtText = "" 'Efface la zone de texte
End If
End Sub

Et c'est terminé... Mais y'a un encore bocou, bocou à faire :^)

Conclusion

FONCTIONNEMENT
Normalement dans une vraie application IRC, le serveur se contente de recevoir les données qu'il analyse et renvoie automatiquement une réponse... bref tout est' automatisé côté Serveur !
Mais dans cet exemple, le serveur est un peu confondu au client... (il faut un administrateur pour répondre aux message :^(. Mais si vous avez assez d'imagination, vous pourrez réparer ce petit inconvénient !

TOUJOURS PLUS...
Ceci n'est qu'un exemple très simple, il y a encore beaucoup à faire pour qu'il devienne une vraie application IRC !! Ex. Faire scroller automatiquement le textbox (facile), vérifier la connexion avant de faire un .send...

BUG...
Quand on travaille avec un ordinateur qui se situe à 100.000 Km de chez soi, on sait que tout est imprevisible. Je vous conseille donc de mettre constamment l'instruction
On Error Resume Next  à l'entête de vos procédure :^)
Et, le programme qu'on vient de créer est encore bourré de bugs (j'en estime une vingtaine :^) !!!

Téléchargement

C'est bien beau tout ça, mais où est le programme lui-même ? Il est là, du calme :^)

          wsIRC.zip - Téléchargez le zip qui contient les deux applications [Codes Sources Complet + Exe]

N'oubliez pas de télécharger dsSocket.zip si vous ne l'avez pas encore fait:

          dsSocket.zip - Téléchargez le zip qui contient l'ocx dsSocket (dsSocket32.ocx) [et l'ocx principal de Winsock (MsWinSck.ocx)].

Ensuite vous le dézippez soit dans c:\windows\system (de préférence) ou dans le repertoire de votre application  et le tour est joué !

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]