cs_Children
Messages postés84Date d'inscriptionlundi 5 février 2007StatutMembreDernière intervention29 avril 2009
-
6 sept. 2008 à 14:11
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 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.
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 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és256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 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és17Date d'inscriptionmardi 9 mars 2004StatutMembreDernière intervention23 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és26Date d'inscriptionvendredi 30 octobre 2009StatutMembreDernière intervention27 juin 20111 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és16Date d'inscriptionmardi 13 avril 2010StatutMembreDernière intervention28 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és13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 6 nov. 2010 à 20:06
HELP svp ! :(
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDerniè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és18Date d'inscriptionlundi 26 janvier 2009StatutMembreDernière intervention 2 mars 2012 5 juin 2010 à 09:33
merci !
cs_jeanmi45
Messages postés27Date d'inscriptionmercredi 31 mars 2004StatutMembreDerniè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és95Date d'inscriptionlundi 11 juin 2007StatutMembreDernière intervention 9 mai 20131 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és95Date d'inscriptionlundi 11 juin 2007StatutMembreDernière intervention 9 mai 20131 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és95Date d'inscriptionlundi 11 juin 2007StatutMembreDernière intervention 9 mai 20131 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és2Date d'inscriptionmercredi 24 novembre 2004StatutMembreDernière intervention21 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és90Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és13Date d'inscriptionmercredi 28 juin 2006StatutMembreDernière intervention21 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és1Date d'inscriptionjeudi 20 octobre 2005StatutMembreDerniè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és1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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/.
' 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és5Date d'inscriptionmardi 24 mars 2009StatutMembreDerniè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és5Date d'inscriptionmardi 24 mars 2009StatutMembreDerniè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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és5Date d'inscriptionmardi 24 mars 2009StatutMembreDerniè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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és5Date d'inscriptionmardi 24 mars 2009StatutMembreDerniè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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 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és84Date d'inscriptionlundi 5 février 2007StatutMembreDernière intervention29 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és84Date d'inscriptionlundi 5 février 2007StatutMembreDernière intervention29 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+
20 mars 2016 à 12:22
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
20 mars 2016 à 00:30
20 déc. 2013 à 14:38
17 oct. 2012 à 22:12
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
17 oct. 2012 à 21:49
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 ;)
17 sept. 2012 à 14:23
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.
27 juin 2011 à 00:28
7 mars 2011 à 17:14
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
6 nov. 2010 à 20:06
29 oct. 2010 à 15:37
5 juin 2010 à 09:33
6 avril 2010 à 23:42
merci pour ton aide
5 nov. 2009 à 20:49
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
5 nov. 2009 à 20:45
3 nov. 2009 à 23:44
Comment faire ?
3 nov. 2009 à 20:37
3 nov. 2009 à 18:54
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
21 août 2009 à 17:22
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.
2 août 2009 à 14:50
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
21 juil. 2009 à 04:27
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
4 juin 2009 à 11:50
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
10 mai 2009 à 13:56
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
@+
3 avril 2009 à 23:24
1 avril 2009 à 22:23
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? ^^'?
1 avril 2009 à 16:16
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 !
31 mars 2009 à 23:48
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?
31 mars 2009 à 16:20
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 ?
26 mars 2009 à 03:25
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?
12 sept. 2008 à 20:43
Là telle qu'elle, elle ne gère rien d'autre que du texte brut.
11 sept. 2008 à 17:56
Y at il une possibilité d'insérer des émoticones dans le texte ?
Afyn - Navedac
7 sept. 2008 à 15:10
6 sept. 2008 à 22:09
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.
6 sept. 2008 à 14:11
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+