Bonjour à tous :) Me revoilà avec une autre question !
Je suis toujours bloqué au paquet 42.
Après la déconnexion du client connectée au serveur d'authentification, je connecte mon nouveau client sur le serveur de jeu obtenu via SelectedServerDataMessage.
Je reçois une donnée de taille 13 (non traitée) mais mon event qui me permet de traiter la donnée ne se déclenche pas.
Classe Client
Cliquez pour révéler
Cliquez pour masquer
using System.Net.Sockets;
using System.Net;
using System.Threading;
using SocketBot.IO;
using SocketBot.Utilities;
namespace SocketBot.Network
{
class Client
{
private Socket _socket;
private Thread receiveThread;
public IPEndPoint _remoteEP;
public int ProtocolId = 0;
// delegate + event pour gérer la réception et l'envoi de données
public delegate void onTravellingDataEventHandler(Client sender, byte[] buffer);
public event onTravellingDataEventHandler onReception;
public event onTravellingDataEventHandler onSending;
// delegate + event pour gérer la connexion d'un client
public delegate void onConnectedEventHandler(Client sender);
public event onConnectedEventHandler onConnected;
// delegate + event pour gérer la déconnexion d'un client
public delegate void onDisconnectedEventHandler(Client sender);
public event onDisconnectedEventHandler onDisconnected;
public Client(Socket socket)
{
_socket = socket;
receiveThread = new Thread(new ThreadStart(Receive));
}
public Client(IPEndPoint remoteEP)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // on initialise la socket
_remoteEP = remoteEP;
receiveThread = new Thread(new ThreadStart(Receive));
}
/// <summary>
/// Connexion et lancement du thread de réception des données serveur
/// </summary>
public void connectAndReceive()
{
if(!_socket.Connected)
_socket.Connect(_remoteEP);
receiveThread.Start();
//onConnected?.Invoke(this);
}
/// <summary>
/// Déconnexion du socket et arrêt du thread
/// </summary>
public void Disconnect()
{
try
{
if (receiveThread != null)
{
receiveThread.Abort();
receiveThread = null;
}
_socket.Close();
}
catch
{
}
onDisconnected?.Invoke(this);
}
/// <summary>
/// Méthode utilisée par le thread receiveThread, permet la réception de données du serveur
/// </summary>
private void Receive()
{
while (_socket.Connected)
{
if (_socket.Available > 0)
{
byte[] buffer = new byte[_socket.Available];
_socket.Receive(buffer);
onReception?.Invoke(this, buffer);
}
}
}
/// <summary>
/// Envoi de données au serveur
/// </summary>
/// <param name="packet">Classe du protocol Dofus</param>
public void Send(NetworkMessage packet)
{
ProtocolId = packet._ProtocolId;
BigEndianWriter writer = new BigEndianWriter();
packet.Pack(writer);
_socket.Send(writer.Data);
onSending?.Invoke(this, writer.Data);
}
}
}
Redirection des event dans mon Main
Cliquez pour révéler
Cliquez pour masquer
_client.onReception += OnDataReceived;
_client.onSending += OndataSending;
_client.onDisconnected += OnSocketDisconnected;
_client.onConnected += OnConnectedClient;
Méthode OnDataReceived
Cliquez pour révéler
Cliquez pour masquer
public void OnDataReceived(Client sender, byte[] buffer)
{
TreatPacket(buffer);
BigEndianReader _reader = new BigEndianReader(ContentTreated);
BigEndianWriter _writer = new BigEndianWriter();
AddItem(false, id, idNames.GetClasseName(id), Length, ContentTreated);
switch (id)
{
case 42:
SelectedServerDataMessage Ssdm = new SelectedServerDataMessage();
Ssdm.Deserialize(_reader);
Client GameSocket = new Client(new IPEndPoint(IPAddress.Parse(Ssdm._address), Ssdm._port));
GameSocket.connectAndReceive();
sender.Disconnect();
sender = null;
/*sender = new Client(new IPEndPoint(IPAddress.Parse(Ssdm._address), Ssdm._port));
sender.connectAndReceive();*/
AddLog(LogType.Information, "Connexion au serveur de jeu ...");
break;
}
}
Le projet en entier disponible sur github.
Merci d'avance ! :D
EDIT : modification du post suite au message de asaki.