Transformer Socket Sychrone Bloquante En Asynchrone

johann74270 Messages postés 12 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 2 juin 2013 - 2 juin 2013 à 11:37
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 4 juin 2013 à 23:37
Hey ! Bonjour à tous, je suis sur un projet (serveur supportant le multi-client),
Cependant, en étant débutant sur les sockets asynchrone, je rencontre plusieurs problèmes de communication, je souhaite que quelqu'un me transforme un bout de code pour rendre les socket asynchrone.

Je vous remercie d'avance pour vos aides qui me sont très précieuse.

L'algorithme souhaité :

[i]Socket mis en écoute de connexion
Accepté le client (procédure non bloquante)
Ajouté le client dans une listview/i
// Envoie des données, je souhaite envoyer d'abords la taille du buffer, puis ensuite je renvoie la trame de données.
[i]Mettre le buffer sur 10 octets
Vidé le buffer
Convertis la taille du buffer en tableau d'octets
Envoie de la trame (taille du buffer)
Mettre le buffer sur la taille des données
Vidé le buffer
Copie du message dans le buffer
Envoie de la trame (les données a envoyé)
Vidé le buffer/i
// Reçois des données, procédure non bloquante, peut recevoir des données de n'importe quel client.
[i]Mettre le buffer sur 10 octets
Vidé le buffer
Reçois la première trame
Mettre le buffer sur la taille des données
Vidé le buffer
Recoie la deuxième trame
Affiche(Convertis en String (Buffer ) )/i


Ci joint mon code source du client qui fonctionne en mode synchrone,
je souhaite le modifier pour le serveur mais en mode asynchrone :

Module Socket
    Dim Socket As New System.Net.Sockets.TcpClient()
    Dim TrafficSocket As System.Net.Sockets.NetworkStream = Nothing
    Dim Buffer() As Byte = Nothing
    Dim AdresseIP As String = "127.0.0.1"
    Dim PortIP As Integer = 801
    Dim Index As Integer = 0
    Sub Connection()
        Socket.Connect(AdresseIP, PortIP)
        TrafficSocket = Socket.GetStream()
    End Sub
    Sub EnvoieDonnees(ByVal P_Message As Byte())
        Index = 0
        ReDim Buffer(9)
        ViderBuffer()
        While Index < (10 - P_Message.Length.ToString.Length)
            Buffer.SetValue(System.Convert.ToByte(&H30), Index)
            Index = Index + 1
        End While
        For Each Chiffre As Char In P_Message.Length.ToString()
            Buffer.SetValue(System.Convert.ToByte(Chiffre), Index)
            Index = Index + 1
        Next
        TrafficSocket.Write(Buffer, 0, Buffer.Length)
        ReDim Buffer(P_Message.Length)
        ViderBuffer()
        Buffer = P_Message
        TrafficSocket.Write(Buffer, 0, Buffer.Length)
        ViderBuffer()
    End Sub
    Sub RecoieDonnees()
        ReDim Buffer(9)
        ViderBuffer()
        TrafficSocket.Read(Buffer, 0, Buffer.Length)
        ReDim Buffer(System.Convert.ToInt32(System.Text.Encoding.ASCII.GetString(Buffer)))
        ViderBuffer()
        TrafficSocket.Read(Buffer, 0, Buffer.Length)
        MsgBox(System.Text.Encoding.ASCII.GetString(Buffer))
    End Sub
    Sub ViderBuffer()
        For Each BufferByte In Buffer
            BufferByte = &H0
        Next
    End Sub
End Module

3 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
2 juin 2013 à 15:01
Bonjour,

Tu peux utiliser un thread (BackGroundWorker ou System.Threadong.Thread) pour gérer cela ou alors utiliser les BeginReceive & co.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
johann74270 Messages postés 12 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 2 juin 2013
2 juin 2013 à 18:43
Merci de votre réponse, oui j'aimerais si possible que vous me convertissez en socket asynchrone avec les sockets, (BeginReceive,BeginAccept,BeginSend)
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
4 juin 2013 à 23:37
Bonjour,

Désolé, mais je n'ai pas le temps de te convertir ton morceau de code, l'aide MSDN est assez claire pour comprendre le fonctionnement.

v----Signature--------v----------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Rejoignez-nous