SOCKET ASYNCHRONE (CLIENT + SERVEUR)

cs_Children Messages postés 84 Date d'inscription lundi 5 février 2007 Statut Membre Dernière intervention 29 avril 2009 - 6 sept. 2008 à 14:11
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 20 mars 2016 à 12:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47853-socket-asynchrone-client-serveur

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
20 mars 2016 à 12:22
Bonjour,
Si tu cherches un code Java, c'est pas dans les sources Vb.net que tu vas le trouver....
http://codes-sources.commentcamarche.net/source/s/java-9/Sockets/last
slt mr j'ai besoin le src en java SVP aide moi
C'est Super !
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
17 oct. 2012 à 22:12
Re-bonsoir,

Je penses avoir trouvé :

Public Function VerifConnexion() As Boolean

Try

Return _Socket.Connected

Catch ex As Exception

RaiseEvent OnErreur(ex)

End Try

End Function

Merci de m'indiquer si ce code est correct (à priori cela fonctionne) !

Olivier
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
17 oct. 2012 à 21:49
Bonsoir à toutes et tous,

Je viens de trouver cette source et la trouve très pratique / facile d'utilisation !
Merci Elguevel pour cette source !

Y a des éléments que je ne maîtrise pas vraiment, mais je me débrouilles.

Toutefois, je voudrais savoir comment vérifier (du côté du client) si le Serveur est toujours connecté !
En effet, j'ai une application cliente qui nécessite la connexion à un serveur en 24/24 et 7j/7 !
Si le Serveur plante, j'envoie un message à l'utilisateur (partie déjà implémentée) mais pour la surveillance de la connexion : un grand mystère subsiste !

Comment puis-je réaliser cela ?

Par avance merci

Olivier

P.S. : Note 9/10 car la perfection n'existe pas, on peut toujours faire mieux ;)
killedman Messages postés 17 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 23 novembre 2017
17 sept. 2012 à 14:23
Bonjour,
Merci pour le source, j'avais déjà fait une application de se genre en JAVA, il y a quelques années.
Ça va me permettre de réviser les sockets, je vais utiliser le source pour ajouter un gestionnaire de commande.

Très pratique pour fermer toutes les instances ouverte d'un logiciel avant une Mise à jour.
Ant95 Messages postés 26 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 27 juin 2011 1
27 juin 2011 à 00:28
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...
bagneux49 Messages postés 16 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 mars 2011
7 mars 2011 à 17:14
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
bleach59800 Messages postés 13 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 6 novembre 2010
6 nov. 2010 à 20:06
HELP svp ! :(
bleach59800 Messages postés 13 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 6 novembre 2010
29 oct. 2010 à 15:37
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 ??
Dean76 Messages postés 18 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 2 mars 2012
5 juin 2010 à 09:33
merci !
cs_jeanmi45 Messages postés 27 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 6 avril 2010
6 avril 2010 à 23:42
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
juliengj Messages postés 95 Date d'inscription lundi 11 juin 2007 Statut Membre Dernière intervention 9 mai 2013 1
5 nov. 2009 à 20:49
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
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
5 nov. 2009 à 20:45
Je ne comprend pas trop ta question. Il suffit de lancer le serveur et 1 client et çà communique, non ?
juliengj Messages postés 95 Date d'inscription lundi 11 juin 2007 Statut Membre Dernière intervention 9 mai 2013 1
3 nov. 2009 à 23: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 ?
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
3 nov. 2009 à 20:37
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à.
juliengj Messages postés 95 Date d'inscription lundi 11 juin 2007 Statut Membre Dernière intervention 9 mai 2013 1
3 nov. 2009 à 18:54
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
benamarj Messages postés 2 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 21 août 2009
21 août 2009 à 17:22
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.
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
2 août 2009 à 14:50
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
Xiu Messages postés 13 Date d'inscription mercredi 28 juin 2006 Statut Membre Dernière intervention 21 juillet 2009
21 juil. 2009 à 04:27
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
bosondehiggs Messages postés 1 Date d'inscription jeudi 20 octobre 2005 Statut Membre Dernière intervention 4 juin 2009
4 juin 2009 à 11:50
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
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
10 mai 2009 à 13:56
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


@+
Neolander Messages postés 5 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 3 avril 2009
3 avril 2009 à 23:24
C'est bon, c'est reglé, j'ai reussi a trouver, Merci encore!
Neolander Messages postés 5 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 3 avril 2009
1 avril 2009 à 22:23
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? ^^'?
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
1 avril 2009 à 16:16
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 !
Neolander Messages postés 5 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 3 avril 2009
31 mars 2009 à 23:48
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?
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
31 mars 2009 à 16:20
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 ?
Neolander Messages postés 5 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 3 avril 2009
26 mars 2009 à 03:25
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?
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
12 sept. 2008 à 20:43
C'est possible, mais il faut le faire.
Là telle qu'elle, elle ne gère rien d'autre que du texte brut.
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
11 sept. 2008 à 17:56
Bonjour

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

Afyn - Navedac
cs_Children Messages postés 84 Date d'inscription lundi 5 février 2007 Statut Membre Dernière intervention 29 avril 2009
7 sept. 2008 à 15:10
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
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
6 sept. 2008 à 22:09
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.
cs_Children Messages postés 84 Date d'inscription lundi 5 février 2007 Statut Membre Dernière intervention 29 avril 2009
6 sept. 2008 à 14:11
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+
Rejoignez-nous