[VB.NET]Socket [Résolu]

- - Dernière réponse : NHenry
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
- 9 sept. 2012 à 14:26
Bonjour à tous et à toutes,
Aujourd'hui si je vous contacte c'est pour vous demander de l'aide. (encooore)
Allons y au but :
Pour l'instant, je n'ai aucun problème à connecté un client à un serveur via l'aide des socket, et à faire en sorte qu'ils puissent communiquer entres eux.

Mais j'ai eu beau cherché sur le net des explications, ou des tutoriels, expliquant comment connecté plusieurs client au même serveur, je n'ai rien trouvé.
Ou alors simplement du code mais ce n'est pas ce que je recherche, sinon se serais trop simple!

Bref, est-ce que quelqu'un d'entre vous aurais des liens sur de bons tutoriels ou alors de la patience pour de m'expliquer, ou m'indiquer comment procéder s'il vous plaît ?

En espérant que quelqu'un puisse m'aider,
Cordialement,
Sorpia.


---------------------------------------------------
Je vous regarde !
Afficher la suite 

20 réponses

Meilleure réponse
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
3
Merci
Bonjour,

Tu peux faire une classe qui gèrera un client à la fois (tu lui passe le socket dans son constructeur paramétré)

Ensuite, tu génère un thread par client pour gérer la réception/émission.

Pour lister les clients, tu peux utiliser une collection : List(Of ...)

Chaque classe généré pourras te permettre de gérer les propriétés et méthodes pour chaque client (par exemple un pseudo, ...) et générer des évènements si besoin.

---------------------------------------------------------------------
[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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
3
Merci
Bonjour,

C'est déjà un bon début, il reste à mémoriser l'objet passé au constructeur dans une variable d'objet, et à l'exploiter.

Concernant la partie
        serveur.Start()

        While Running
            If serveur.Pending Then
                nb_client += 1
                c(nb_client) = New Client(serveur.AcceptTcpClient)

            End If
        End While


Une collection éviterais de t'embêter avec un tableau (en plus, tu pourras retirer plus facilement un élément sans faire de trou).
Il faudra aussi sans doute séparer le AcceptClient de sa mise dans la collection pour pouvoir ajouter les handlers des évènements de la classe "client".

Mon site

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

Pour voir où tu en es, comment gères-tu les client coté serveur actuellement ?

Normalement, en invoquant la méthode Listen (ou similaire) du TcpListener, tu peux récupérer un TcpClient de la connexion TCP, rien ne t'empêche des gérer plusieurs client avec ça.

---------------------------------------------------------------------
[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
Commenter la réponse de NHenry
0
Merci
Pour l'instant je ne gère pas plusieurs clients, je ne sais pas comment faire pour en accepter plusieurs... :(
---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
0
Merci
Pour l'instant voici ce que j'ai fait (je m'est que le plus important):

    Dim Clients(100) As TcpClient
    Dim nb_client As Integer = 0
    Dim Running As Boolean = True
    Dim serveur As TcpListener
    serveur.Start()

    While Running
       If serveur.Pending Then
            nb_client += 1
            Clients(nb_client) = serveur.AcceptTcpClient
        End If
    End While


Les clients se connectent, maintenant comment leur envoyer des messages ?

Ici seul le premier client reçoit le message :
For x = 1 To nb_client
            Try
                Dim SendBytes(mes.Length) As Byte
                XStreamX = Clients(x).GetStream()
                SendBytes = Encoding.UTF8.GetBytes(mes)
                XStreamX.Write(SendBytes, 0, SendBytes.Length)
                CHATList.Items.Add(mes)
            Catch exep As Exception

            End Try
        Next x


Le mieux serait que je puisse les ajouter dans une listview quand ils se connectent et ainsi leur envoyer des messages personels, mais comment faire ?
---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
0
Merci
Re-Bonjour,
comment puis-je passer le socket à ma classe ?

J'ai pour l'instant créé la classe "Client" avec quelque propriété.


---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

en paramétrant le constructeur :

Public Sub New(Byval MonClient As ...)

---------------------------------------------------------------------
[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
Commenter la réponse de NHenry
0
Merci
Désoler mais c'est nouveau pour moi la création de classe, donc je suis un peu à la ramasse... Est-ce vraiment obliger de passer par là ?


---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

C'est ce qu'il y aura de plus pratique à gérer par la suite.

---------------------------------------------------------------------
[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
Commenter la réponse de NHenry
0
Merci
Ok, je vais continuer dans ce chemin là alors. Mais demain, car la je suis crevé ^^.

Bonne nuit :D
Sorpia.


---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
0
Merci
Bon, voici mon code pour le moment :

La classe "Client" :

Imports System.Net.Sockets

Public Class Client

    Private _pseudo As String
    Public Property pseudo() As String
        Get
            Return _pseudo
        End Get
        Set(ByVal value As String)
            _pseudo = value
        End Set
    End Property

    Private _ip As String
    Public Property ip() As String
        Get
            Return _ip
        End Get
        Set(ByVal value As String)
            _ip = value
        End Set
    End Property

    Private _pays As String
    Public Property pays() As String
        Get
            Return _pays
        End Get
        Set(ByVal value As String)
            _pays =  value
        End Set
    End Property

    Public Sub New(ByVal MonClient As TcpClient)

    End Sub

End Class


Et comment je l'utilise :

 serveur.Start()

        While Running
            If serveur.Pending Then
                nb_client + = 1
                c(nb_client) = New Client(serveur.AcceptTcpClient)

            End If
        End While

---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
0
Merci
Voici pour la liste de clients :

 Dim ListeClients As New List(Of Client)
-----------------------
        serveur.Start()

        While Running
            If serveur.Pending Then
                c = New Client(serveur.AcceptTcpClient)
                ListeClients.Add(c)

            End If
        End While


[...]il reste à mémoriser l'objet passé au constructeur dans une variable d'objet, et à l'exploiter.


Public Sub New(ByVal MonClient As TcpClient)
        Dim c As TcpClient = MonClient


    End Sub


Ce que je ne comprend pas c'est en suite comment l'exploiter ?

---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

La variable à créer pour mémoriser durablement l'objet TcpClient est endehors de métjodes, du genre :

Class Client
Private mTcpClient As TcpClient
...

... Sub New(...)
mTcpClient=...


Puis dans ton constructeur, tu peux créer un thread qui scrutera les données reçues ou alors utiliser les fonction de lecture asynchrones.

---------------------------------------------------------------------
[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
Commenter la réponse de NHenry
0
Merci
Voici ce que j'ai fait pour le moment, un moment ça à marché mais plus maintenant ! Je comprend pas pourquoi...

Public Sub Receive()
        Dim bool As Boolean = True
        While bool
            Dim Message As StringBuilder = New StringBuilder()
            Dim stream As NetworkStream


            Dim RecevoirBytes(c.ReceiveBufferSize) As Byte
            If c.Available > 0 Then
                Try
                    stream = c.GetStream()
                    stream.Read(RecevoirBytes, 0, CInt(c.ReceiveBufferSize))
                    Message.Append(Encoding.UTF8.GetString(RecevoirBytes, 0, CInt(c.ReceiveBufferSize)))
                    Form1.CHATList.Items.Add(Message.ToString)
                Catch exep As Exception
                    MessageBox.Show(exep.Message)
                End Try
            End If
        End While
    End Sub

    Public Sub New(ByVal MonClient As TcpClient)
        c = MonClient
        thread_connect = New Threading.Thread(AddressOf Receive)
        thread_connect.Start()

    End Sub



---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

En dehors du thread principal, il est interdit d'accéder aux membres des Winforms.

Je te conseil plutôt d'utiliser des évènements et AddHandler pour remonter des informations.

Aussi un peu de lecture :
http://www.vbfrance.com/forum/sujet-CROSS-THREAD-OPERATION-NOT-VALID_1560214.aspx
http://www.codeproject.com/Articles/15861/How-to-solve-quot-Cross-thread-operation-not-valid

Mon site
Commenter la réponse de NHenry
0
Merci
Quels évènements utiliser ?

Et puis je ne peux pas utiliser "invoke" depuis ma classe client.
Je n'est pas d'idées...


---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

Tu peux déclarer un évènement (mot clé Event) dans ta classe Client, cet événement sera récupéré par la classe parents (Sub + AddHandler) qui invoquera le code nécessaire pour faire les actions désirées ( Événement, action directe, envoi général, ...).

---------------------------------------------------------------------
[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
Commenter la réponse de NHenry
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
J'oubliais, regardes aussi RaiseEvent.
Commenter la réponse de NHenry
0
Merci
Bonjour,
Désoler pour ma réponse tardive, c'est du à la rentrée des cours...

Sinon, merci à toi de m'avoir aider NHenry. J'arrive maintenant à gérer plusieurs clients.


---------------------------------------------------
Je vous regarde !
Commenter la réponse de Utilisateur anonyme
Messages postés
14599
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 décembre 2019
137
0
Merci
Bonjour,

Merci pour le retour :)

Si c'est résolu, penses à clore le sujet :
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=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
Commenter la réponse de NHenry