Accueil > Forum > > > > Client socket
Client socket
jeudi 14 août 2008 à 22:07:13 |
Client socket

pintux
|
Bonjour à tous, J'essaye d'écrire un client -serveur en vb.net pour le serveur tout va bien puisque lorsque je le questionne via un telnet, il m'envoie bien l'information attendue. Par contre côté client c'est la Cata,ça par en vrille, voici un extrait de mon code Public Class Form1 Private socket AsNew Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Private IPAdresse As IPAddress = System.Net.IPAddress.Parse("192.168.0.2") Private iPEndPoint As IPEndPoint = New System.Net.IPEndPoint(IPAdresse, 1960) Private Message AsByte() Private BufferDonnées As System.Text.StringBuilder = New System.Text.StringBuilder("") Private threadClient AsNew Thread(AddressOf TraitementClient) Private Sub ButtonClient_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonClient.Click threadClient.Start() End Sub Private Sub TraitementClient() socket.Connect(iPEndPoint) If (socket.Connected) Then MsgBox("Client connecté", MsgBoxStyle.Information, "Socket connecté") End If Try socket.Receive(Message) For Each val AsByteIn Message Dim s AsString = Chr(val) BufferDonnées.Append(s) Next Dim résultat AsString = BufferDonnées.ToString TextBoxClient.Text = résultat Catch erreur As SocketException End Try threadClient.Abort() ButtonClient.Text = "OK" End Sub End Class A chaque fois j'ai une alerte «L'exception System.ArgumentNullException n'a pas été gérée La valeur ne peut pas être null. Nom du paramètre : buffer" Cela laisse penser que le tableau de byte Message soit null, pourtant en passant par telnet je récupère bien des données, ce qui prouve que le serveur n'envoie pas un élément null. J'ai déjà fait du client-serveur en Java, j'avoue que c'est moins prise de tête. Merci pour toutes aides apportées Philippe
|
|
vendredi 15 août 2008 à 23:39:32 |
Re : Client socket

Kevin.Ory
|
Salut,
Même si ton client recoit des données, la variable Message doit quand même être valide, ce qui n'est pas le cas car tu là déclare en tableau vide. Tu dois donc déclarer la taille du tableau, un truc de ce genre serait l'idéal: Private Message(Socket.ReceiveBufferSize)As Byte
Autre info, il y a d'autre classe dans le framework qui pourrait nettement te simplifier la vie. Je pense notamment à la classe TcpClient, qui permet des envois/réceptions asynchrones (donc inutile de déclarer un nouveau thread) ainsi que d'autre améliorations que je te laisse découvrir. Si tu veux tout de même utiliser un autre thread, il y a le BackgroundWorker qui est très utile et nettement plus simple d'utilisation que de déclarer soit même un thread (pour le passage d'info entre les threads notamment) Pour passer de ton buffer de bytes (Message) à du texte et vice versa, utilise un codeur/décodeur que tu trouvera dans le namespace System.Text. Ca te permettra de transformer la totalité de ton buffer en String, sans devoir utiliser ta très très lente boucle utilisant la fonction char.
|
|
samedi 16 août 2008 à 09:21:48 |
Re : Client socket

pintux
|
Salut Kevin, D'abord, merci pour ton intéret.J'ai essayé de déclarer Le tableau, comme tu me l'as sugéré. Private Message(Socket.ReceiveBufferSize)As Byte Mais cela génère une erreur dans Visual Studio Erreur 1 Impossible de spécifier des modificateurs de tableau pour la variable et son type. Je vais essayé d'utiliser la classe TspClient qui en effet à l'air sympa.
Cordialement
Philippe
|
|
samedi 16 août 2008 à 21:00:40 |
Re : Client socket

Kevin.Ory
|
Heu.. ce n'est pas normal ça..
Et si tu utilise une constante plutôt que Socket.ReceiveBufferSize? (Je ne suis pas sur du nom de cette propriété)
Private Message(1024) As Byte
|
|
dimanche 17 août 2008 à 13:24:00 |
Re : Client socket

pintux
|
Salut Kevin, J'ai tout repris à plat avec donc un Objet de type TCPClient, voici mon code Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class Form1 'Private socket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Private IPAdresse As IPAddress = System.Net.IPAddress.Parse("192.168.0.2") Private iPEndPoint As IPEndPoint = New System.Net.IPEndPoint(IPAdresse, 1960) Private tcpClient As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient(iPEndPoint) 'Private callback As AsyncCallback 'Private longueur As Integer = Socket.ReceiveBufferSize Private Message(tcpClient.Available) AsByte 'Private BufferDonnées As System.Text.StringBuilder = New System.Text.StringBuilder("") Private Sub ButtonClient_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonClient.Click tcpClient.Connect(iPEndPoint) If (tcpClient.Connected) Then ButtonClient.Text = "Connecté" End If Dim LongueurDonnées AsInteger = tcpClient.ReceiveBufferSize tcpClient.Client.Receive(Message, tcpClient.Available, SocketFlags.None) Dim msg AsString = System.Text.Encoding.Unicode.GetString(Message) TextBoxClient.Text = msg tcpClient.Close() End Sub End Class Cela se passe bien du côté buffer. Néanmoins lorsque je lance le client j'obtient le message suivant Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée Il semble que le client ne puisse pas avoir le même IPEndPoint que le serveur. Pourtant c'est la base du principe client -serveur. En effet, le serveur est en écoute sur une machine identifiée par son IP et cette écoute se fait sur un port X. Le client doit donc s'adresser à cette même adresse IP afin d'atteindre la machine qui héberge le service et sur le port X afin de solliciter ce service. Voici des années que je travaille en réseau et j'ai toujours constaté ce principe de fonctionnement en client-serveur.Du reste lorsque l'on développe en Java la conception se fait sur ces fondements. En vb.net, Visual Studio m'insulte, si le serveur et le client ont le même IPEndPoint. Et dans le cas contraire, rien ne fonctionne, ce qui est logique. Je ne vois pas d'autre solution que d'avoir un IPEndPoint avec les mêmes valeurs pour le serveur et le client. A moins que Microsoft a réinventé le client-serveur !!! Très Cordialement Philippe
|
|
dimanche 17 août 2008 à 21:11:04 |
Re : Client socket

Kevin.Ory
|
Je dois dire que je ne sais plus comment on fait une réception multicast, mais pour faire une simple connexion client-serveur, le serveur écoute la connexion entrante avec un TcpListener.
Voici à quoi ça ressemble (un seul thread (interface bloquante) et un seul client) :
Private Sub frmServer_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown ' Adresse et port à écouter Dim listener As New TcpListener(IPAddress.Parse("127.0.0.1"), 3456) ' Démarrer le Listener listener.Start() ' Attente d'une connexion entrante (bloquant) Dim client As TcpClient = listener.AcceptTcpClient() ' Obtenir le stream Dim s As NetworkStream = client.GetStream ' Buffer pour les données réçues Dim Buffer(client.ReceiveBufferSize) As Byte Try Do ' Lire les données (bloquant) Dim len As String = s.Read(Buffer, 0, client.ReceiveBufferSize) ' Conversion Bytes => String Dim message As String = System.Text.Encoding.Unicode.GetString(Buffer, 0, len) ' Afficher le message txtLog.AppendText(message & vbCrLf) ' Rafraichir l'affichage Application.DoEvents() Loop Catch ex As Exception End Try End Sub
De cette façon, on obtient un TcpClient par client qui s'est connecté...
|
|
lundi 18 août 2008 à 12:26:50 |
Re : Client socket

pintux
|
Salut Kevin, D'abord merci pour ton aide. Côté serveur, j'ai procédé de façon un peu différente, car j'ai utilisé un objet de type Socket dans un thread, cela donne un code un peu moins clair, mais cela fonctionne aussi très bien, j'ai testé avec plusieurs telnet lancés en parallèle, et tout est OK. C 'est lorsque je lance le client, que je me fais insulté, et uniquement si le serveur est déjà lancé. Ce qui démontre bien une incidence entre le serveur et le client, du reste le message d'erreur ne laisse aucun doute "Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée". Ce qui bloque c'est bien qu'il existe 2 sockets ayant les mêmes paramètres (protocole/adresse réseau/port), mais cela me parait indispensable pour que le client et le serveur puisse échanger des infos, je ne vois pas comment il pourrait en être autrement. Pour que 2 entités dialoguent, il est nécessaire de le faire sur une même base. Il en est de même pour un client et un serveur, même protocole, même port, et bien sûr le client doit se brancher sur l'adresse IP de la machine qui héberge le service. Mais, ce mode de fonctionnement ne semble pas compatible avec le framework .NET. J'avoue qu'après plusieurs années de travail dans le monde des réseaux, et après avoir développé des outils de supervision réseau (Java) ; j e reste sans voie devant un tel message qui va à l'encontre du modèle client-serveur .Je ne trouve donc pas de justification à ce message, qui néanmoins est bloquant. Je souhaitais donc juste comprendre l'origine de celui-ci, si il sagissait d'une limitation propre au framework .Net, d'un bug, ou à d'un nouveau modèle client-serveur ?
Très cordialement Philippe
|
|
lundi 18 août 2008 à 19:42:09 |
Re : Client socket

Kevin.Ory
|
Il est possible d'écouter les connexions entrantes avec un socket, c'est indiqué sur MSDN, et d'ailleur TcpListener utilise un socket pour jouer son rôle. Par contre, c'est impossible avec un TcpClient, qui n'a pas été créé pour ça et qui doit être utilisé de pair avec un TcpListener.
Tu essaie d'écouter les connexion entrante avec un TcpClient dans ton serveur?
Il faut soit utiliser un TcpListener, soit configurer un Socket de la bonne façon. Je crois qu'il y a un exemple complet sur MSDN d'un serveur asynchrone en utilisant des sockets.
La classe Socket est un wrapper de l'API socket de Windows, rien n'a été réinventé... seul les classe TcpClient et TcpListener sont nouvelles.
|
|
lundi 18 août 2008 à 19:53:17 |
Re : Client socket
|
lundi 18 août 2008 à 21:09:56 |
Re : Client socket

pintux
|
Salut Kevin, Pour Mon serveur, j'utilise un socket au lieu d'un TcpListener. Mais de toute façon le TCPListener utilise un socket sous-jacent, tout fonctionne bien. En fait mon socket serveur est en écoute , lorsqu'un client le sollicite, il accept la connexion sur un autre socket qui envoie au client l'information demandée tandis que le socket dédié à l'écoute reprend son écoute. Tests à l'appui, c'est tout bon.. Seul le client me pose des problèmes. Cordialement Philippe
|
|
Cette discussion est classée dans : end, system, private, client, socket
Répondre à ce message
Sujets en rapport avec ce message
server/client winsock [ par idealprog ]
salut,je veu réaliser 2 prog du type server et client par winsock, le but etant juste de lance le server sur un pc et connecter le client au server pa
Winsock avec internet [ par gregmena ]
GREG_SIDIUSBonjour à tous, je viens de commencer à programmer avec le contrôle Winsock et j'ai un problème. Le voici :je viens
Internet et Winsock [ par gregmena ]
GREG_SIDIUSBonjour à tous, je viens de commencer à programmer avec le contrôle Winsock et j'ai un problème. Le voici :je viens de
Envoi fichier winsock ... [ par nashoy ]
Bonjours à tous,donc voilà, ça fait mnt plusieurs jours que je cherche comment envoyer simplement (enfin le stricte nécessaire) un fichier d'un winsoc
winsock multiutilisateurs [ par ltvian ]
bon ben voila le code de mon serveur winsock , mon problème est ke lorske je veux balancer le message par le bouton envoi , il n'y a k'un seul utilisa
problème avec mon user control [ par buze63 ]
salut, voila mon problème. J'ai une page aspx dans le laquelle j'utilise un user control.Dans ce user control g un label et un textbox et je n'arrive
gestion ouverture et fermeture de form [ par geii82 ]
bonjour à tous, j'espère que vou spourrez m'aider, alors voilà je suis débutant en vb.net et j'ai un cthi bout de code qui ne marche pas et j'aimerai
Probleme pour Expet vb.net 2005 [ par XGuarden ]
Bonjour, mon probleme est très complexe et je doute avoir de réponse honetement lol. J'essait tout de meme.J'ai une classe qui hérite du controle text
Comment Réaliser un DragandDrop avec des panel contenant des picturebox [ par Nabil461 ]
pouvez vous m'aider a réalsier un draganddrop avec des pannel contennant, des picturebox, je ne sais pas si je doit draguez les 11 pannel ou bien leur
Controle de la lecture d'un fichier Flash [ par vbkriss ]
Bonjour,Dans une application contenant seulement Form1, j'ai placé un composant ShockWave Flash Object, un Label, 3 TextBox, 1 LinkLabel, 1 timer et 1
Livres en rapport
|
Derniers Blogs
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
Comparez les prix

HTC Hero
Entre 550€ et 550€
|