Serveur a multi client via socket [Résolu]

tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 28 avril 2012 à 11:56 - Dernière réponse : NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention
- 15 mai 2012 à 20:56
Bonjour,Voila sa fait deja quelque mois que j'ai apprit a utiliser VB.net avec vb.net 2010 express,enfin bref ...
J'aimerais comme dit le titre créer un serveur et client.
On m'a dit que la meilleur technique pour un serveur multi client et de installer des Socket pour le serveur donc sa fait un moment je cherche un Tutorial sur les sockets.

Bref pason voici ma demande exactement :

1-Le client et obliger d'avoir des socket ou lui peut utiliser winsock (exemple serveur socket client winsock )

2-Pouvez-vous m'aidez à trouver un Tutorial sur les socket et leur gestion ?
car je sais déclarer des sockets mais je sais pas comment en importer plusieurs et surtout les connecté et déconnecte.

Merci d'avance
Afficher la suite 

30 réponses

Répondre au sujet
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 5 mai 2012 à 15:01
+3
Utile
Bonjour,

en .NET, regardes plutôt System.Net.Sockets.TcpListener et System.Net.Sockets.TcpClient.

Ce sera plus simple à gérer.

---------------------------------------------------------------------
[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.VisualVasic (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
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 5 mai 2012 à 16:41
+3
Utile
Bonjour,

Utilises une variable colmptant le nombre de connexion faites.

Sinon, regardes du coté des collections : List(Of ...)

---------------------------------------------------------------------
[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.VisualVasic (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
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 5 mai 2012 à 19:23
+3
Utile
Bonjour,

Il y a un flux pour chaque Socket, regardes dans les propriétés des classes.

---------------------------------------------------------------------
[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.VisualVasic (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
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 9 mai 2012 à 17:09
+3
Utile
c'est bon j'ai trouvé !
voici les codes
serveur :
Imports System.Net.Sockets.TcpListener
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1
    Dim serversocket As New TcpListener(IPAddress.Parse("192.168.1.10"), 4000)
    Dim clientsocket As TcpClient

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        coClient.RunWorkerAsync()
    End Sub

    Private Sub coclient_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles coClient.DoWork
        Dim counter As Integer = 0
        serversocket.Start()
        While (True)
            counter += 1
            clientsocket = serversocket.AcceptTcpClient
            MsgBox("clientsocket n°" + Convert.ToString(counter) + "-- connexion")
        End While
        clientsocket.Close()
        serversocket.Stop()
    End Sub
    Public Function GetStream() As NetworkStream
        Dim netStream As NetworkStream = clientsocket.GetStream()
        Dim sendbytes As [Byte]() = Encoding.UTF8.GetBytes("test")
        netStream.Write(sendbytes, 0, sendbytes.Length)
        clientsocket.Close()
        netStream.Close()
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        GetStream()
    End Sub
End Class


Client :
Imports System.Net.Sockets.TcpClient
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Class Form1
    Dim clientsocket = New TcpClient("192.168.1.10", 4000)
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
getstream
    End Sub
    Public Function GetStream() As NetworkStream
        Dim netStream As NetworkStream = clientsocket.GetStream()
        Dim bytes(clientsocket.ReceiveBufferSize) As Byte
        If netStream.CanRead Then
            netStream.Read(bytes, 0, CInt(clientsocket.ReceiveBufferSize))
            Dim returndata As String = Encoding.ASCII.GetString(bytes)
            MsgBox(returndata)
            clientsocket.Close()
            netStream.Close()
        End If
    End Function
End Class


seul chose comment fait ton pour appeler le getstream quand il recoi des données
Car la moi je l'appelle via le load du form mais bon pas terrible
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de tonyledragon
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 13 mai 2012 à 15:06
+3
Utile
Bonjour,

En .NET, il y a pas d'indexation, et encore moins de Winsock, TcpClient et TcpListener sont suffisant.

Tu peux faire une classe, contenant le TcpClient (définit avec un constructeur paramétré).

Ensuite, tu accèderas à des membres de cette classe comme par exemple :
- EnvoyerMessage
- GetPseudo
- ...

Ensuite, elle pourra avoir des évènements :
- MessageReçu
- Client déconnecté
- ...

Pour déclarer la collection (dans un module par exemple) :
Public MaListeDeClients As List(Of MaClasse)=New List(Of MaClasse)


Pour ajouter une instance :
Dim MonObjet as MaClasse= New MaClasse(MonTcpClient)
MaListeDeClients.Add(MonObjet)
AddHandler MonObjet.MonEvent, New Delegate...(AddressOf ...)

Pour envoyer un message à tous les clients :
For Each lClient as MaClasse In MaListeDeClients
lClient.SendMessage(MonMessage)
Next

---------------------------------------------------------------------
[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.VisualVasic (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
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 5 mai 2012 à 16:28
+1
Utile
Bonjour,

Car tu ne décrémentes jamais : counter
Il faut le faire quand le client se déconnecte.


---------------------------------------------------------------------
[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.VisualVasic (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
---
Commenter la réponse de NHenry
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 28 avril 2012 à 14:59
0
Utile
Bonjour,

en .NET, on utilise pas le composant winsock, mais l'espace de nom System.Net.Sockets et notamment les classes TcpListener et TcpClient.

---------------------------------------------------------------------
[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.VisualVasic (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
---
Commenter la réponse de NHenry
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 2 mai 2012 à 15:42
0
Utile
Ok,merci j'aimerais savoir si il existe un Tutorial détailler d'une connexion multi client avec les sockets que je puisse comprendre leur fonctionnement ?
Commenter la réponse de tonyledragon
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 3 mai 2012 à 13:57
0
Utile
Bonjour,

Cela existe, je pense, mais en cherchant un peu, tu trouveras pas mal d'exemple.

---------------------------------------------------------------------
[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.VisualVasic (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
---
Commenter la réponse de NHenry
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 4 mai 2012 à 16:45
0
Utile
C'est pas des exemple que je veux enfin si mais des exemples bien expliquer car quand je voie des codes certe j'essaye les comprendre mais je comprend pas et j'ai trouve des 100 ene de code tous différent les un des autres a force je ne sais plus comment ou quel fonction utilise pour mon serveur
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 11:38
0
Utile
Salut voila je up car j'aimerais vraiment de l'aide j'ai fait un grand effort j'ai essayer par moi même avec mes petit connaissance a faire quelque chose de correct donc je suis arriver a faire une connexion avec un client basique comment puis-je accepter plusieurs client et surtout si quelque peut m'aider a dev le code. voici le code :

Client
Imports System.Net
Imports System.Net.Sockets
Class Form1
    Dim clientsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim hostip As IPAddress = IPAddress.Parse("192.168.1.10")
        Dim hostport As Integer = 4000
        clientsocket.Connect(New IPEndPoint(hostip, hostport))
    End Sub
End Class


Coter Serveur :
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
    Dim listensocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim hostip As IPAddress = IPAddress.Parse("192.168.1.10")
        Dim hostport As Integer = 4000
        listensocket.Bind(New IPEndPoint(hostip, hostport))
        listensocket.Listen(3)
        listensocket.BeginAccept(AddressOf connexioncallback, listensocket)
    End Sub

    Private Sub connexioncallback(ByVal asyncresult As IAsyncResult)
        MsgBox("Connexion etablie")
    End Sub
End Class


Ce code fonctionne mais pour la 1er connexion.
Merci d'avance
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 15:46
0
Utile
Salut voila c'est vrai c'est plus simple je trouve maitenant j'ai essayer avec le serveur comme ceci :
Imports System.Net.Sockets.TcpListener
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
    Dim serversocket As New TcpListener(IPAddress.Parse("192.168.1.10"), 4000)
    Dim clientsocket As TcpClient

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim counter As Integer = 0
        serversocket.Start()
        While (True)
            counter += 1
            clientsocket = serversocket.AcceptTcpClient
            MsgBox("clientsocket n°" + Convert.ToString(counter) + "-- connexion")
        End While
        clientsocket.Close()
        serversocket.Stop()

    End Sub
End Class


Avec ce code le client peut se connecté sans aucun problème plusieurs fois il détecte tout
Me reste plus cas modifier le client juste pouvez vous me dire si c'est correcte ?
Commenter la réponse de tonyledragon
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 5 mai 2012 à 16:08
0
Utile
Bonjour,

Au lieu de faire la réception des clients dans un Form1_Load, essayes plutôt de le faire dans un thread (BackGroundWorker et System.Threading.Thread).

---------------------------------------------------------------------
[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.VisualVasic (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
---
Commenter la réponse de NHenry
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 16:20
0
Utile
Ok juste pour information j'ai remarquer que si tu connecté 15 client ben il dit 15 connecte tu en déconnecte par exemple 2 tu en reconnecte 1 il dit 16 client je voulais savoir si c’était grave qu'il charge plusieurs client en 1 + 1 ou il y a un moyen tester les sockets et d'attribuer une socket vide ?

J'ai réaliser le code serveur comme ceci :
Imports System.Net.Sockets.TcpListener
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
    Dim serversocket As New TcpListener(IPAddress.Parse("192.168.1.10"), 4000)
    Dim clientsocket As TcpClient
    
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        coclient.RunWorkerAsync()
    End Sub

    Private Sub coclient_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles coclient.DoWork
        Dim counter As Integer = 0
        serversocket.Start()
        While (True)
            counter += 1
            clientsocket = serversocket.AcceptTcpClient
            MsgBox("clientsocket n°" + Convert.ToString(counter) + "-- connexion")
        End While
        clientsocket.Close()
        serversocket.Stop()
    End Sub
End Class


et le code client comme ceci pour le moment
Imports System.Net.Sockets.TcpClient
Imports System.Net
Imports System.Net.Sockets
Class Form1
    Dim clientsocket = New TcpClient("192.168.1.10", 4000)
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    End Sub
End Class
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 16:35
0
Utile
Oui mais j'ai une question dans ce systeme :

Exemple
12 client connecté
le client n°5 ce déconnexion
donc on décrémentes sa fait donc 12 -1 = 11 client
1 client ce connecte sa remonte a 12 mais le problème et que
il y aurez 2 client en ID 12 non ?
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 16:48
0
Utile
Ok ben en cas ou je reviendrais sur ce poste merci ton aide
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 5 mai 2012 à 18:50
0
Utile
Re bonjour,J'ai oublier une question la plus importante comment puis-je recepetionner les messages y a t'il un moyen spécial a part la commande receive ?
Commenter la réponse de tonyledragon
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 7 mai 2012 à 19:37
0
Utile
Salut,Voila je revien la car avec toute la bonne volonté que j'ai je n'arrive point a avancer ou c'est moi qui comprend rien ou sinon c'est que je peut réviser mon visual basic d'un cote je débarque de vb6 donc dur de me mettre comme sa d'un coup au vb.net bref passon
Aurez tu un code pour la fonction receivre ?
Commenter la réponse de tonyledragon
NHenry 14133 Messages postés vendredi 14 mars 2003Date d'inscription 22 avril 2018 Dernière intervention - 7 mai 2012 à 20:40
0
Utile
Bonjour,

Quel est ton code de réception actuellement ?

---------------------------------------------------------------------
[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.VisualVasic (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
---
Commenter la réponse de NHenry
tonyledragon 173 Messages postés lundi 2 mai 2011Date d'inscription 13 décembre 2012 Dernière intervention - 8 mai 2012 à 20:21
0
Utile
J'ai juste rajouter
Public Function ReceiveFrom()

    End Function

Je sais pas trop vers ou me tourné pour savoir comment va être réceptionner les donnée et comment la function va s'appeler quand un client envoie des données
Commenter la réponse de tonyledragon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Serveur a multi client via socket - page 2