Sockets | Envoi Réception [Résolu]

- - Dernière réponse :  Utilisateur anonyme - 23 mai 2012 à 23:15
Bonjour,
je suis entrain de créer un chat, niveau connexion tout baigne mais dés que je veux recevoir un message via le client du serveur, ça fait mal! Je m'explique :
Lorsque je me suis connecter via le client au serveur, j'ai une multitude de message m'indiquant "La référence d'un objet n'est pas définie à une instance d'un objet" (Normal car j'ai choisi de recevoir un message à chaque erreur lors de la réception de message en provenance du serveur)

Pour plus de précision, voila le code du client:

Imports System.Net.Sockets
Imports System.Text

Public Class Form1

    Dim pseudo As String
    Dim client As New TcpClient
    Dim StreamW As NetworkStream = Nothing
    Dim StreamR As NetworkStream = Nothing

    Private Sub ButCo_Click(sender As System.Object, e As System.EventArgs) Handles ButCo.Click
        If PseudoTxt.Text "" Or PORTtxt.Text "" Or IPtxt.Text = "" Then
            MsgBox("Veuiller remplir toutes les cases !", vbInformation)
        Else
            Try
                client.Connect(IPtxt.Text, PORTtxt.Text)
                Me.Text = "Client - Connecté"
                MsgBox("Vous êtes à présent connecté.", vbInformation)
                pseudo = PseudoTxt.Text
                IPtxt.Enabled = False
                PORTtxt.Enabled = False
                PseudoTxt.Enabled = False
                ButCo.Enabled = False
                Timer1.Start()
            Catch ex As Exception
                MsgBox("Serveur introuvable !", vbInformation)
                Me.Text = "Client - Déconnecté"
            End Try
        End If
    End Sub

    Private Sub ButDeco_Click(sender As System.Object, e As System.EventArgs) Handles ButDeco.Click
        IPtxt.Enabled = True
        PORTtxt.Enabled = True
        PseudoTxt.Enabled = True
        ButCo.Enabled = True
    End Sub

    Private Sub ButEnvoi_Click(sender As System.Object, e As System.EventArgs) Handles ButEnvoi.Click
        Try
            StreamW = client.GetStream
            Dim SendBytes() As Byte = Encoding.UTF8.GetBytes(pseudo + " : " + EnvoiMes.Text)
            StreamW.Write(SendBytes, 0, SendBytes.Length)
            StreamW.Flush()
        Catch exep As Exception
            MsgBox(exep.Message)
        End Try
    End Sub

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Dim RecevoirBytes(client.ReceiveBufferSize) As Byte
        If Not (Encoding.UTF8.GetString(RecevoirBytes)) = Nothing Then
            Try
                StreamR.Read(RecevoirBytes, 0, client.ReceiveBufferSize)
                CHATrich.Text = CHATrich.Text + vbNewLine + (Encoding.UTF8.GetString(RecevoirBytes))
            Catch exep As Exception
                MsgBox(exep.Message)
            End Try
        End If
    End Sub
End Class


Et le code du serveur :
Imports System.Net.Sockets
Imports System.Text
Imports System.IO

Public Class Form1
    Dim serveur As TcpListener
    Dim client As TcpClient
    Dim StreamW As NetworkStream = Nothing
    Dim StreamR As NetworkStream = Nothing

    Private Sub ButServ_Click_1(sender As System.Object, e As System.EventArgs) Handles ButServ.Click
        serveur = New TcpListener(PortTxt.Text)
        serveur.Start()
        client = serveur.AcceptTcpClient()
        MsgBox("Client connecté.", vbInformation)
        ButServ.Enabled = False
        PortTxt.Enabled = False
    End Sub


    Private Sub ButEnv_Click(sender As System.Object, e As System.EventArgs) Handles ButEnv.Click
        Try
            StreamW = client.GetStream
            Dim SendBytes() As Byte = Encoding.UTF8.GetBytes("Serveur : " + MessageTxt.Text)
            StreamW.Write(SendBytes, 0, SendBytes.Length)
            StreamW.Flush()
        Catch exep As Exception
            MsgBox(exep.Message)
        End Try
    End Sub
End Class


Je vous préviens ce n'est pas terminé!

Bref je pense que le problème viens du fait que mon timer essaye de récupérer un message vide en provenance du serveur.

J’espère vraiment que vous allez pouvoir m'aider,
Sorpia.


PS: J’espère que vous avez bien compris mon problème, je suis un peu fatigué :D.
Afficher la suite 

Votre réponse

20/33 réponses

Meilleure réponse
3
Merci
Bonsoir,
Dans ton tout premier code, j'ai beau chercher mais je ne vois pas où est l'instruction StreamR = client.GetStream pour lire des données.
Soit dit en passant, de StreamR ou StreamW, l'un des deux ne sert à rien puisqu'un networkstream est un flux réseau où l'on peut lire et écrire.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
Dans RecevoirMessage, il te manque la lecture des données pour remplir le buffer recevoirbytes -> xstreamx.read(recevoirbytes,.... après XStreamX = client.GetStream()

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

"La référence d'un objet n'est pas définie à une instance d'un objet"
C'est la fameuse NullReferenceException.

Tu tentes de travailler sur un objet non initialisé.

Regardes toutes les valeur de la ligne en cause pour voir d'où vient l'erreur, puis, fais un test : If MonObjet Is Nothing Then ...

---------------------------------------------------------------------
[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
0
Merci
Ok merci je regarde ça des que mon ordi est disponible :),
Merci.
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,
c'est bon je n'ai plus les messages d'erreur j'ai remplacé par ça :
        Dim RecevoirBytes(client.ReceiveBufferSize) As Byte
        If Not RecevoirBytes(client.ReceiveBufferSize).ToString = "0" Then
            Try
                StreamR.Read(RecevoirBytes, 0, client.ReceiveBufferSize)
                CHATrich.Text = CHATrich.Text + vbNewLine + (Encoding.UTF8.GetString(RecevoirBytes))
            Catch exep As Exception
                MsgBox(exep.Message)
                MsgBox("(Encoding.UTF8.GetString(RecevoirBytes))   = " + (Encoding.UTF8.GetString(RecevoirBytes)))
                Timer1.Stop()
            End Try
        End If


Mais bon lorsque j’essaye d'envoyer un message depuis le serveur je ne reçois rien. J'utilise ceci :
Try
            StreamW = client.GetStream
            Dim SendBytes() As Byte = Encoding.UTF8.GetBytes("Serveur : " + MessageTxt.Text)
            StreamW.Write(SendBytes, 0, SendBytes.Length)
            StreamW.Flush()
        Catch exep As Exception
            MsgBox(exep.Message)
        End Try


Pouvez-vous m'aidez s'il vous plaît?

Merci,
Sorpia.
Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

As-tu essayer de regarder ce que te renvoi ton serveur avec un WireShark ou un Telnet ?

En pas à pas, tu passes dans ta procédure de lecture ?

---------------------------------------------------------------------
[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
0
Merci
Bonjour,
en pas à pas avec le serveur lorsque je veux envoyer un message tout baigne,
Mais en pas à pas pour le client qui doit recevoir le fichier, il passe en boucle le timer (commence à if et va direct à end if).

Sinon pourrais tu s'il te plaît m'expliquer ce qu'est le telnet ou le WireShark si tu as le temps, ou me donner le lien d'une aide? En attendant je continue mes recherches,

merci,
Sorpia.
Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

Je n'ai pas bien compris pourquoi tu utilises :
client.ReceiveBufferSize
Alors qu'il faudrait plutôt utiliser :
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.available.aspx

Ni le but de :
RecevoirBytes(client.ReceiveBufferSize).ToString = "0"

Car ce qui est intéressant c'est de savoir si des octets sont en attente, pas si la valeur contenue dans le tableau (qui ne contient rien à cet instant) est 0.

---------------------------------------------------------------------
[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
0
Merci
Bonjour,

J'ai trouvé ce code sur le site msdn, mais j'ai toujours l'erreur ci dessous sur
If StreamR.CanRead then
:

"La référence d'un objet n'est pas définie à une instance d'un objet"


If StreamR.CanRead Then
            Dim myReadBuffer(1024) As Byte
            Dim myCompleteMessage As StringBuilder = New StringBuilder()
            Dim numberOfBytesRead As Integer = 0

            Do
                numberOfBytesRead = StreamR.Read(myReadBuffer, 0, myReadBuffer.Length)
                myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
            Loop While StreamR.DataAvailable

            MsgBox(myCompleteMessage.ToString())
        End If


A ce qu'il parait c'est car il est null.
Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

N'utilise pas CanRead, mais
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.available.aspx

De plus, où as-tu initialisé StreamR ?

---------------------------------------------------------------------
[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
0
Merci
Bonjour,

J'ai enfin réussi!, sauf que je reçois un message vide :

If client.Available Then
            Dim myReadBuffer(1024) As Byte
            Dim myCompleteMessage As StringBuilder = New StringBuilder()
            Dim numberOfBytesRead As Integer = 0

            myCompleteMessage.AppendFormat(Encoding.UTF8.GetString(myReadBuffer, 0, numberOfBytesRead))

            MsgBox(myCompleteMessage.ToString())
        End If


Pourrais-tu m'aider s'il te plaît ?
Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

En .NET, lis le point 3 de ma signature.

Ensuite, utilise la valeur retournée par Available pour savoir combien d'octet sont en attente.

---------------------------------------------------------------------
[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
0
Merci
Bonjour,

J'ai toujours rien avec ceci :
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        If client.Available Then
            Dim myReadBuffer(1024) As Byte
            Dim myCompleteMessage As StringBuilder = New StringBuilder()

            myCompleteMessage.AppendFormat(Encoding.ASCII.GetString(myReadBuffer, 0, client.Available.ToString))

            MsgBox(myCompleteMessage.ToString)
        End If
    End Sub


Mais lorsque je mets Option Strict à ON j'ai une erreur et lorsque je décoche Microsoft.VisualBasic tout mes messages box sont "non-déclarer". C'est vraiment important de l'enlever?

Merci encore de ta patience,
Sorpia.
Commenter la réponse de Utilisateur anonyme
Messages postés
14324
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
Bonjour,

Oui, donc il faut rectifier les erreurs (si tu ne sais pas comment demande).

Pour les MsgBox, utilises plutôt Messagebox.Show.

---------------------------------------------------------------------
[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
0
Merci
Ok merci à toi, je m'occupe de ça demain.

Bonne nuit :).

Sorpia.
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,
merci de l'information banana32 ^^.

Sinon pour recevoir j'ai ça : (client)
Dim Message As StringBuilder = New StringBuilder()
        Dim RecevoirBytes(client.ReceiveBufferSize) As Byte

        If CBool(client.Available) Then
            Try
                client.GetStream()
                Message.Append(Encoding.UTF8.GetString(RecevoirBytes, 0, CInt(client.ReceiveBufferSize)))
                CHATrich.Text = CHATrich.Text + Environment.NewLine + Message.ToString
            Catch exep As Exception
                MessageBox.Show(exep.Message)
            End Try
        End If


Pour envoyer : (serveur)
Try
            Stream = client.GetStream
            Dim SendBytes() As Byte = Encoding.UTF8.GetBytes("Serveur : " + MessageTxt.Text)

            Stream.Write(SendBytes, 0, SendBytes.Length)

        Catch exep As Exception
            MsgBox(exep.Message)
        End Try


Mais je reçois toujours de messages vides! Je pense que cela viens du serveur lors de l'envoie car si je récupère SendByte en string, ils me mettent : System.Byte[] (crochet vide, enfin c'est juste une déduction)

Et puis le serveur envoie non stop des messages, peut-êtres car je reçois côté client via un timer.

PS : J'ai suivi les instruction de ta troisième signature!

Merci,
Sorpia.
Commenter la réponse de Utilisateur anonyme
0
Merci
Les lignes de code de ta partie 'client' sont complètement dans le désordre.
La ligne client.GetStream() est erronée car elle ne mentionne aucun networkstream comme assignation (une fonction retourne une valeur).

Note : évite de nommer tes variables avec des noms réservés comme 'Stream'

1 - indiquer au networkstream qui est le client : MonStream = client.GetStream
2 - dimensionner le buffer
3 - préparer le message et l'écrire dans le buffer
4 - envoyer les données MonStream.write(... dailleurs absent de ton code.

si je récupère SendByte en string, ils me mettent : System.Byte[]
De la même façon que tu as transformé ton string en tableau de bytes, tu dois récupérer ton tableau de bytes de l'autre côté et utiliser GetString pour le transformer en string.
Commenter la réponse de Utilisateur anonyme
0
Merci
Je ne comprends pas pourquoi tu as abandonné le code de ton premier post.
Il suffisait juste de remplacer une lettre pour qu'il fonctionne. StreamW au lieu de StreamR.Read(...
Commenter la réponse de Utilisateur anonyme
0
Merci
... Et de sortir cette ligne étrange :
If Not (Encoding.UTF8.GetString(RecevoirBytes)) = Nothing Then

Tu essaie de lire un buffer vide (sans interêt)
Commenter la réponse de Utilisateur anonyme
0
Merci
Oui mais cela fait partie de mon ancien code, peux tu regardé celui au dessus de ton dernier poste s'il te plaît?
Et puis If Not ne devrait pas "Si le machin-truc-chose n'est pas truc alors..."?

Sorpia.
Commenter la réponse de Utilisateur anonyme

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.