Faciliter la communication D2 avec D2Com
Versions du tutoriel (D2Com.dll : v1.1.2)
[clignote]Version VB.Net traduite à partir du C#, il se peut qu'il ait quelques erreurs de traduction...[/clignote]
Table des matières
1) Introduction
2) Pré-requis
3) D2Com.D2Connect
4) D2Com.IO.DataReader
5) D2Com.IO.DataWriter
6) Conclusion
1) Introduction
Bien le bonjour les Caderniens !
Aujourd'hui je vais vous expliquer comment utiliser l'outil D2Com (Forum "Autre" -> "Projets", pensez à vous y inscrire si ce n'est pas fait). Il s'agit d'une librairie avec des fonctions prêtes à l'emploi ! Alors profitez-en !
J'ai développé cet outils dans l'optique de faciliter la tâche aux concepteurs de programmes utilisant le protocole D2. Ainsi vous pourrez gagner énormément de temps dans votre développement. Mais sachez toutefois qu'un bon développeur connait parfaitement ce qu'il fait et par conséquent utiliser cet outil sans savoir ce qu'il fait
est une grave erreur !
Veuillez tout de même connaître le protocole D2 afin d'utiliser D2Com.
2) Pré-requis
He bien pour pouvoir suivre ce tutoriel vous aurez besoin de connaître votre langage de programmation ! Avec une dose des Sockets et vous serez au point.
Quand je vous dit que D2Com vous facilite la tâche ;)
Je vous conseille tout de même de lire la documentation incluse dans l'archive téléchargée, elle permettra de vous apprendre un peu sur les classes utilisables.
Tout le reste sera du développement pur de votre programme. C'est à vous donc de réfléchir aux différentes fonctions qu'offre votre programme.
/!\ D2Com n'offrant pas encore la possibilité d'utiliser l'espace D2Com.Network (les paquets) vous devez traduire vos propres paquets pour le moment.
3) D2Connect
Pensez à utiliser l'espace de noms D2Com par défaut en insérant un Imports en tête de votre fichier.
La première chose à faire c'est de créer un nouvel objet instancié de type D2Connection en tant qu'attribut afin qu'il soit accessible partout.
Vu qu'on va aussi utiliser ses évènements, alors on lui place le mot clé "WithEvents"
Private WithEvents _ServerConnection As D2Connection = New D2Connection()
Private Sub ServerConnection_PacketReceived(ByVal sender As Object, ByVal e As PacketDataEventArgs) Handles _ServerConnection.PacketReceived
' Action à faire lorsqu'un paquet est reçu
' Ajouter une ligne au log par exemple...
' e.ProtocolID => ID du paquet
' e.Content => Tableau d'octets du contenu du paquet
' e.WholePacket => Tableau d'octets du contenu du paquet avec le header compris (id, taille de la taille, taille et contenu)
' Cela permet parfois de déboguer vos paquets
logTextBox.Text = "[Reçu] ID = " & e.ProtocolID & "| Taille = " & e.Content.Length
End Sub
Private Sub ServerConnection_PacketSend(ByVal sender As Object, ByVal e As PacketDataEventArgs) Handles _ServerConnection.PacketSend
' Action à faire lorsqu'un paquet est envoyé au serveur
' Ajouter une ligne au log par exemple...
' e.ProtocolID => ID du paquet
' e.Content => Tableau d'octets du contenu du paquet
' e.WholePacket => Tableau d'octets du contenu du paquet avec le header compris (id, taille de la taille, taille et contenu)
' Cela permet parfois de déboguer vos paquets
logTextBox.Text = "[Envoyé] ID = " & e.ProtocolID & "| Taille = " & e.Content.Length
End Sub
Dans la fonction de l'évènement Click d'un bouton, ou bien de l'évènement Load d'une Form ou dans une fonction, vous devez lancer la connexion grâce à la méthode Start().
/!\ Attention ! Si vous utilisez une interface utilisateur, ce qui est très probable vous devez d'abord indiquer votre méthode Invoke à la propriété DispatchMethod.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Si vous êtes en WinForm
Me._ServerConnection.DispatchMethod = AddressOf Me.Invoke
' Si vous n'êtes pas dans un programme interface utilisateur ce n'est pas la peine de définir cette propriété.
' On crée une socket pour se connecter au serveur d'authentification du jeu et on la donne à D2Connect.
Dim socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
socket.Connect("213.248.126.180", 5555)
Me._ServerConnection.Socket = socket
' C'est à vous dé vérifier que la socket est bien connectée ;)
If Me._ServerConnection.Start() Then ' La méthode Start() renvoi true si la connexion est réussie, sinon renvoi false
MessageBox.Show("Démarré !")
Else
MessageBox.Show("Démarrage impossible : " & Me._ServerConnection.State.ToString()) 'Obtient l'état actuel de notre classe.
End If
End Sub
On n'oublie pas de vite ajouter l'évènement de notre Form "FormClosing" pour arrêter D2Connection !
Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
If Me._ServerConnection.Start() Then ' Renvoi true si l'arrêt et réussi, sinon false
MessageBox.Show("Arrêté !")
End If
End Sub
4) DataReader
Ça deviens une habitue : ajoute de l'utilisation de l'espace de noms D2Com.IO par défaut en insérant un using en tête de votre fichier.
Rien de plus simple que d'utiliser DataReader ! Il suffit de lui donner le tableau d'octets à lire et après on demande quoi lire !
Ce tableau d'octets peut s'obtenir lorsque vous recevez un paquet un paquet par exemple. (le fameux "e.Content")
byte[] contenu_a_lire;
// Instanciation normale
DataReader reader = new DataReader();
reader.Content = contenu_a_lire;
// Ou bien passer directement le contenu à lire en paramètre dans le constructeur
DataReader reader = new DataReader(contenu_a_lire);
// On peut aussi charger le contenu à lire à partir d'un fichier (D2I, D2O, D2P etc.)
DataReader reader = new DataReader("adresse absolue du fichier");
// Puis on lit ce dont on a besoin avec les méthodes proposées
reader.ReadString();
reader.ReadInt();
reader.ReadDouble();
// etc.
5) DataWriter
Le DataWriter est légèrement plus compliqué à utiliser.
Il possède en tout cas quelques subtilités à connaître ;)
' Instanciation normale
Dim reader As DataReader = New DataReader()
' Ou bien passer directement le ProtocolID du paquet à écrire en paramètre dans le constructeur
Dim reader As DataReader = New DataReader(4) ' ID du message "IdentificationMessage
' On peut aussi définir la propriété ProtocolID
writer.ProtocolID = 4
' Pour ajouter une donnée, il faut utiliser la méthode "Write()"
Dim mon_nombre As Integer = 1654
writer.Write(mon_nombre) ' on écrit sur 4 octets.
' Dans les paquets souvent les attributs sont déclarés comme un type et sont écrit en un autre.
' Par exemple souvent les types int sont écris en short. Alors on fait un cast
writer.Write((short)mon_nombre) ' ça sera bien sur 2 octets qu'on va écrire au lieu de 4.
' Maintenant on envoi le paquet au serveur
_ServerConnection.Send(4) ' Envoi un paquet vide avec le ProtocolID 4
_ServerConnection.Send(4, writer); ' Envoie le paquet 4 avec les données du writer
// Si on veut l'envoeyr vers une socket extérieure, dès qu'on a fini d'écrire on crée le paquet avec la méthode "Pack()" qui renvoi un tableau d'octets contenant le
paquet.
Dim to_send As Byte()
to_send = writer.Pack() ' On peut l'appeller si on a déjà défini le ProtocolID
to_send = writer.Pack(4) ' Sinon il est toujours pas trop tard pour l'indiquer ;)
' On peut envoyer les données par une socket
une_socket.Send(to_send)
' Ou pour abréger
une_socket.Send(writer.Pack())
6) Conclusion
Voilà ce tutoriel est terminé !
J’espère que vous allez en profiter pleinement de D2Com ;)
Je sais bien que D2Com est encore en développement, d'autres outils sont bientôt de projet.