begin process at 2012 02 13 20:48:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > SOCKET ASYNCHRONE (CLIENT + SERVEUR)

SOCKET ASYNCHRONE (CLIENT + SERVEUR)


 Information sur la source

Note :
8 / 10 - par 6 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous :socket, asynchrone, serveur, client, ethernet Niveau :Initié Date de création :02/09/2008 Date de mise à jour :29/07/2010 13:48:30 Vu / téléchargé :12 487 / 1 765

Auteur : elguevel

Ecrire un message privé
Site perso
Commentaire sur cette source (27)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voila un exemple de "Chat", ou plus précisément une application utilisant des sockets Asynchrones.
J'ai essayé d'écrire cet exemple de façon la plus claire possible afin que tout le monde comprenne bien, car j'ai moi même bien galéré pour le mode asynchrone.

La solution est divisé en trois projets : une partie serveur (IHM), une partie cliente (IHM) et une librairie permettant la gestion des sockets aussi bien coté client que serveur, utilisable dans n'importe quelle de vos projet.

Les clients se connectent au serveur.
Le Serveur écoute et accepte les connexions d'un ou plusieurs clients.

Un message envoyé du serveur l'enverra à tout les clients connectés.
Un message envoyé d'un client, l'enverra sur le serveur qui à son tour le dispatchera aux autres clients.


 Conclusion

Il se peut qu'il reste encore quelques problèmes lors des déconnexions.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 juillet 2010 13:48:32 :
Amélioration de la gestion asynchrone

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) CLASSE POUR PILOTER EXCEL SIMPLEMENT
Source avec Zip Source avec une capture Source .NET (Dotnet) REMOTE KEYLOGGER
Source avec Zip Source avec une capture Source .NET (Dotnet) JEU DU MORPION .NET
Source avec Zip Source avec une capture Source .NET (Dotnet) CALCULATEUR DE RESISTANCE .NET
Source avec Zip Source avec une capture Source .NET (Dotnet) AFFICHEUR 7 SEGMENTS

 Sources de la même categorie

Source avec Zip Source avec une capture GESTIONNAIRE DE TÉLÉCHARGEMENT, AVEC REPRISE ET MULTITHREADI... par Madx23
Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA par vicosta
Source avec Zip Source avec une capture DICTIONAIRE TEXT/AUDIO/VISUELLE ANGLAIS AVEC WEBBROWSER CONT... par majnounmajda
Source avec Zip Source .NET (Dotnet) NSLOOKUP EN VB.NET OU COMMENT FAIRE UNE REQÛETE DNS EN PRÉCI... par ShareVB
Source avec Zip Source avec une capture MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS... par lemout

 Sources en rapport avec celle ci

Source .NET (Dotnet) ASYNC SOCKET par iLgend
Source avec Zip Source avec une capture Source .NET (Dotnet) SOCKET ASYNCHRONES : SERVEUR WEB par Megafan
Source avec Zip CHAT :SERVEUR/MULTICLIENT par youzou
Source avec Zip Source .NET (Dotnet) B@Z SOCKET V 1.4 - CLASS DE SOCKET AVEC ÉVÉNEMENTS, MULTI-C... par babboss
Source avec Zip FISC - CHAT MULTIUSER par pyrosmoke

Commentaires et avis

Commentaire de Children le 06/09/2008 14:11:38 9/10

Première remarque: ta source marche a merveille ;)
Deuxième remarque: si tu souhaite créer une source clair (et c'est tout à ton avantage, car il y a beaucoup de source sur les sockets peut accessible aux débutant, un peu comme moi :p) je te suggère de mettre directement le code en "brut" (je ne sais pas si c'est le terme exact), plutôt que d'utiliser mysettings, et une form pour gérer les préférence. Cela permettrait, à mon avis de rendre le code beaucoup plus compréhensible. Et pour la rendre encore plus accessible, ne pas utiliser de classe met directement les fonctions des sockects permettrait de bien comprendre comment utiliser ces derniers. Évidemment cela rend le code "sale", mais bon...ce ne sont que des suggestions...
a+

Commentaire de elguevel le 06/09/2008 22:09:24

Déjà content que çà fonctionne sur d'autres configurations que la mienne.

Sinon on est toujours partagé entre le fait de faire une source qui ne s'adresse qu'aux débutants et donc peu évolutive ( écrit en "brute" et hyper minimaliste), et le fait de faire un truc qui ressemble plus à un projet (modulable, facilement adaptable et propre).

Pour ma part je préfère faire des trucs propres, mais en jouant le jeu à fond ( bien renommer chaque composant, faire des classes distinctes, variables explicites, commentaires, ...), de plus cette approche donne l'exemple sur là façon de travailler et devient normalement claire. Si on ne fait que des trucs crades (et dieu sait qu'il y en a) tout le monde va faire pareil.

Le fait de faire ici une classe pour gérer la socket à part est au contraire plus simple pour ma part que tout mettre dans une Form. Si j'avais tout mis dans la form principale (comme fond certains) on ne sait plus quoi appel quoi (surtout le système des événements) et on ne sait plus ce qui appartient à la form et ce qui est lié à la socket.

Après les appelles aux ressources et l'utilisation des classes devrait normalement être étudié avant l'utilisation des sockets. Normalement un débutant devrait maitriser certaines approches avant d'autres... sinon effectivement on y arrive pas. J'ai d'ailleur classé cette source comme "Initié", et ici le mot débutant est assez relatif.. ce sont surtout les débutants en Socket.

En tout cas merci pour ta réaction.

Commentaire de Children le 07/09/2008 15:10:26

Ce que j'entendais par compréhensible était "clair", "visible". Mais comme tu l'a dit on est partagé entre la méthode "brute" et la  méthode "propre". Il est vrai que la méthode propre permet de me mieux guider, mais cela dépend de la façon qu'ont les personnes d'observer le code. Après pour le terme débutant il est vrai que pour aborder les sockets il faut déjà avoir certaines bases, mais, par ma propre expérience, quand je voit directement par exemple truc.connect("127.0.0.1"), cela me permet d'identifier en un coup d'oeil la fonction et de comprendre le reste plus rapidement plutôt que d'aller chercher à quoi correspondent les variables. Après il est sûr que ce n'est pas pour ça que le code va devenir moins compréhensible :p

Commentaire de Afyn le 11/09/2008 17:56:07

Bonjour

Y at il une possibilité d'insérer des émoticones dans le texte ?

Afyn - Navedac

Commentaire de elguevel le 12/09/2008 20:43:46

C'est possible, mais il faut le faire.
Là telle qu'elle, elle ne gère rien d'autre que du texte brut.

Commentaire de Neolander le 26/03/2009 03:25:45

Bonjour, est ce qu'en partant du module ElgSocketClient.vb, on peut lancer plusieurs sockets au même temps?

Pour l'instant j'ai réussi a utiliser ce fichier précis pour lancer une sorte de client pour un serveur personnel, mais disons que suis a un défi, je doit pouvoir lancer 9 connections a partir d'une seule windows.form, est ce que c'est possible avec ce bout de code.

Si oui, pouvez vous m'aiguiller sur la façon de proceder?

Commentaire de elguevel le 31/03/2009 16:20:42

Je ne vois pas bien l'interet de faire un truc comme çà, mais oui c'est possible ...

Par exemple on peut faire un tableau ou une liste de ElgClientSocket et lancer les sockets une après les autres :

' On declare dans la Class MainForm une liste de ElgClientSocket
Private ListeSocketCliente As List( Of ElgClientSocket )

Ne pas oublier d'instancier la liste dans le constructeur => ListeSocketCliente = New List( Of ElgClientSocket )

' On veut 10 socket clientes, une boucle c'est bien pour çà !
For I as Integer = 1 to 10

' On crée une socket cliente et on l'active
Dim SocketCliente As New ElgClientSocket( [Serveur], [Port] )


' On associe les evenements de chaques socket aux methodes de la MainForm

' Les methodes permette ensuites de savoir quelle socket à
' declencher l'evenement via le parametre "Sender"
AddHandler SocketCliente.OnConnexion, AddressOf e_Connexion
AddHandler SocketCliente.OnDeconnexion, AddressOf e_Deconnexion
AddHandler SocketCliente.OnEnvoie, AddressOf e_Envoi
AddHandler SocketCliente.OnReception, AddressOf e_Reception
AddHandler SocketCliente.OnErreur, AddressOf e_Erreur

' On ajoute la nouvelle socket à la liste  
' afin de garder un lien avec celles-ci
ListeSocketCliente.add( SocketCliente );

' On peut ensuite piocher dans la "Liste" pour gerer
' nos sockets cliente (suppression, arret, lecture, etc...)

Next

Mais je repose la question, çà sert à quoi ?

Commentaire de Neolander le 31/03/2009 23:48:19

Alors, je le redit

A la base j'aurais donc Plusieurs serveurs, il faudrait que je puisse me connecter sur chacun d'entre eux, qui a un serv qui utilise le même code source que tu a la du coté serveur, et chacun devra répondre a des commandes qui seront envoyées a des intervalles minutées.

Pour l'instant disons que c'est juste un défi entre collègues, un proof of concept, pour peut être plus tard surveiller nos serveurs et plus.
Maintenant il est propable que tu me dise y'a de meilleurs solutions, mais je ne suis qu'un tres debutant qui debute a peine donc bon.

Aussi tu me dis qu'on peut piocher dans la liste pour gerer, sa veut dire qu'ils ne peuvent pas etre actifs et repondre a des données qui arrivent en temps reel tous au meme temps?

Commentaire de elguevel le 01/04/2009 16:16:48

Ah ok ok plusieurs serveurs et 1 client, alors là oui la solution est bonne.

Et si, chacune des sockets clientes va pouvoir communiquer avec le serveur en temps réel sans probleme.
Je voulais juste dire qu'une liste etait plus elegante pour gerer un grand nombre d'objets (au nombre indeterminé) qu'avoir une variable par objet.

Mauvaise methode :
-------------------

' 1 variable/objet
Dim socketCliente1 as ElgSocketClient
Dim socketCliente2 as ElgSocketClient
Dim socketCliente3 as ElgSocketClient

Bonne methode :
----------------

' Instancie
Dim socketCliente as new ElgSocketClient( ... )

' Stock
Liste.add( socketCliente );

PS : J'utilise d'ailleur cette methodes de liste coté serveur pour stocker les clients connectés.

Bon code !

Commentaire de Neolander le 01/04/2009 22:23:24

Merci beaucoup de ton aide, j'ai essayé, et sa marche vachement bien (hyper fier de moi ^^')

Je vais pouvoir avancer a grands pas.

Il me reste encore un truc, une petite histoire de synchronisation entre les serveurs, dés que le serv 1 envoie un certain packet, on dis a serv 2 voila ce packet applique le, pareil pour le 3 , le 4 et ainsi de suite, j'ai une petite idée la dessus, mais l'impression que je m'embrouille trop dessus, tu pourrais me filer juste ce dernier petit coup de pouce? ^^'?

Commentaire de Neolander le 03/04/2009 23:24:57

C'est bon, c'est reglé, j'ai reussi a trouver, Merci encore!

Commentaire de violent_ken le 10/05/2009 13:56:40 10/10

Très bonne source !

Pour compléter un peu, voilà une classe qui permet de sérializer/compresser, c'est à dire transformer un objet serializable en tableau de bytes (compressé par GZip).

En gros, plutôt que d'envoyer juste une string comme message, on envoie l'instance d'une classe. Il faut juste ajouter <Serializable()> devant le 'Public Class XXXX' pour que la classe soit serializable.




' =======================================================
' Yet Another (remote) Process Monitor (YAPM)
' Copyright (c) 2008-2009 Alain Descotes (violent_ken)
' https://sourceforge.net/projects/yaprocmon/
' =======================================================


' YAPM is free software; you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation; either version 3 of the License, or
' (at your option) any later version.
'
' YAPM is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with YAPM; if not, see http://www.gnu.org/licenses/.


Option Strict On

Imports System.IO
Imports System.IO.Compression
Imports System.Runtime.Serialization.Formatters.Binary

Public Class cSerialization

    ' Return byte array from data class
    Public Shared Function GetSerializedObject(ByVal obj As cSocketData) As Byte()
        Dim formatter As System.Runtime.Serialization.IFormatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using ms As New MemoryStream()
            formatter.Serialize(ms, obj)
            Return CompressByteArray(ms.ToArray())
        End Using
    End Function

    ' Return data class from byte array
    Public Shared Function DeserializeObject(ByVal dataBytes As Byte()) As cSocketData
        Try
            Dim formatter As System.Runtime.Serialization.IFormatter = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
            Using ms As New MemoryStream(DeCompressByteArray(dataBytes))
                Return DirectCast(formatter.Deserialize(ms), cSocketData)
            End Using
        Catch ex As Exception
            Trace.WriteLine("Error during serialization : " & ex.Message)
            Return Nothing
        End Try
    End Function

    Private Shared Function CompressByteArray(ByRef b() As Byte) As Byte()
        'Return b
        Dim ms As New MemoryStream()
        Dim s As Stream = New GZipStream(ms, CompressionMode.Compress)
        s.Write(b, 0, b.Length)
        s.Close()
        Return DirectCast(ms.ToArray(), Byte())
    End Function

    Private Shared Function DeCompressByteArray(ByRef b() As Byte) As Byte()
        'Return b
        Dim writeData(4096) As Byte ' = new byte[4096]
        Dim memStream As MemoryStream = New MemoryStream()
        Dim s2 As Stream = New GZipStream(New MemoryStream(b), CompressionMode.Decompress)
        Dim size As Integer = 1

        While (size > 0)
            size = s2.Read(writeData, 0, writeData.Length)
            memStream.Write(writeData, 0, size)
            memStream.Flush()
        End While
        Return memStream.ToArray()

    End Function

End Class


@+

Commentaire de bosondehiggs le 04/06/2009 11:50:12

Bonjour,

cette source m'intéresse beaucoup mais je rencontre quelques souci
j'ai le message suivant:
Une exception de première chance de type 'System.Net.Sockets.SocketException' s'est produite dans System.dll
Je me suis rendu compte que le problème est du à _Socket.Bind(New IPEndPoint(IPAddress.Any, PortEcoute)) dans le constructeur est ce que quelqu'un a une idée sur cette erreur

Merci

Commentaire de Xiu le 21/07/2009 04:27:18

Salut,
Super simpa ta source, maintenant comment envoyé un socket en réponse à un autre socket

Exemple " Salut " -> " Sa va ? "

Une réponse précise à un socket précis, dans un ordre.
Merci

Commentaire de Tropic le 02/08/2009 14:50:02

Bonjour,

Comment fait-on pour récupérer l'adresse IP hôte
avant de faire un SocketClient.LaSocket = LaSocket.EndAccept(async)
En fait, avant d'accepter la connexion

Commentaire de benamarj le 21/08/2009 17:22:47 9/10

Bonjour,

Premièrement bravo pour la source.

Un vraiment tout petit bémol pour la gestion de la réponse, je m'explique.

Lorsqu'on envoi un message de 30 caractère et que ensuite on en envoi un de 10 il sera compléter par les 20 derniers du premier message.

Je vais réparer ce petit problème et adapter ton code a mes besoins encore merci et joli boulot.

Commentaire de juliengj le 03/11/2009 18:54:50 9/10

Super source. Pour se qui est de  sa :

AVERTISSEMENT : ce logiciel est protégé par la loi relative au droit d'auteur et par les conventions internationales. Toute reproduction ou distribution partielle ou totale du logiciel sans autorisation, par quelque moyen que ce soit, est strictement interdite. Toute personne ne respectant pas ces dispositions se rendra coupable du délit de contrefaçon et sera passible des sanctions pénales prévues par la loi.


On a le droit de modifier le projet est de distribuer le client a nos amis ?

Merci d'avance

Commentaire de elguevel le 03/11/2009 20:37:38

Désolé pour le disclaimer, il faut l'ignorer. Tu peux tout à fait distribuer, modifier ou publier cette source à volonté. J'utilise en fait des templates pour mes projets, et du coup ce texte n'a rien à faire là.

Commentaire de juliengj le 03/11/2009 23:44:44

Bonjour, comment envoyer un message a 1 personne ? Par exemple on reçois un message de l'IP, 145.267.2.7, le serveur envois un message juste a cette personne.
Comment faire ?

Commentaire de elguevel le 05/11/2009 20:45:39

Je ne comprend pas trop ta question. Il suffit de lancer le serveur et 1 client et çà communique, non ?

Commentaire de juliengj le 05/11/2009 20:49:07

oui tu n a as compris ^^. Oui sa fonctionne tout sa mais je voudrai par exemple le client 1 a l'adresse IP 1256.235.3.4 . Je veux envoyer un message juste a cette personne.
Se code le permet
Client.SendData("MON MESSAGE" & vbNewLine)

Mais le client doit forcement envoyer un message pour luis répondre.
Je veux faire sa sens qu'il m'envoie un message

Commentaire de jeanmi45 le 06/04/2010 23:42:45

Bonsoir, bravo pour ta source. Je l'utilise simplement en client pour me connecter à un serveur. Tout est ok sauf un truc important: quand le serveur est mort, je ne suis pas averti par un event pour me dire que la connexion est HS....?

merci pour ton aide

Commentaire de Dean76 le 05/06/2010 09:33:20 9/10

merci !

Commentaire de bleach59800 le 29/10/2010 15:37:43

Salut ! Trop cool !! Mais j'ai un petit problème ! Comment faire pour que si je veux, le serveur envoie un message qu'à une personne ??

Commentaire de bleach59800 le 06/11/2010 20:06:26

HELP svp ! :(

Commentaire de bagneux49 le 07/03/2011 17:14:01

bonjour a tous!
je débute en prog et je voulai savoir en quoi la sérialisation et la désérialisation était nécessaire ici?
merci d'avance

Commentaire de Ant95 le 27/06/2011 00:28:26 2/10

nul ! aucune gestion du buffer pour envoyer des messages de n'importe quelle taille, et le code est pleins de fonctions complètement inutiles, je mets 2...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Winsock client qui ne marche qu'une fois! [ par Olivier ] Mon application client serveur fonctionne parfaitement une seule fois.La seconde fois, le client plante sur .connect en annonçant "adresse en cours d' Socket SSL appli client/serveur de videosurveillance [ par darktigrou ] Bonjour dans le cadre d'un projet je developpe une appli client/serveur de videosurveillance et je souhaite utiliser des sockets securis&#233;s SSL, m PROBLEME SOCKET -serveur vb, client php [ par StiriX ] Bonjour à tous et à toutes !je fais une application client serveur. Mon but est de récupérer une socket envoyé par un client php sur un serveur vb, et [Socket] Envoie de fichiers exe [ par ZedMaTrix ] Hello à tous. Je cherche à tranférer des fichiers exe par des sockets, et j'ai donc fais le tour des sources du site, mais impossible :/ Donc j'ai fai Serveur, Client, FTP, Socket , Stream [ par dbx99 ] Bonjour,ma question a pour but de m'orienter dans la bonne direction.Je souhaite créer une application serveur à laquelle on ne pourra accéder que par Vive les socket... [ par minb2215 ] Salut! Alors, je m'explique:j'ai une application client, avec un socket configuré et fonctionnel,j'ai une application serveur, avec un socket configur socket+doevents [ par hudsonhawk3 ] Bonjour, je tente de développer une aplication client serveur avec un accès à une base de donnée.le serveur se connecte à la base de donnée et récupèr socket [ par yvesyves ] Bonjour,J'ai developpé un client et un serveur. Mon serveur accepte le cleint et créé un nouveau socket. Là pas de problèmes. Je produis simultanément Socket [ par yvesyves ] Bonjour,J'ai créé un serveur et un client. Le serveur un TcpClient envoie un fichier au client par bloc de 102400 octets.Voilà comment je fais pour fa Socket [ par Clad49 ] Bonjour !j'aimerai réaliser un chat (1 serveur et plusiseurs client). Le code que j'ai fait jusqu'a présent me permet de me connecté au server avec 1


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,018 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales