Sockets | Envoi Réception [Résolu]

Signaler
-
 Utilisateur anonyme -
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.

33 réponses


Je t'ai donné la marche à suivre à 16:58:34
Messages postés
14788
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 mai 2021
155
Bonjour,

CBool(client.Available)
On écrirais plutôt :
client.Available>0

Je n'ai pas tout regardé, mais visiblement, tu as plus d'aisance en VB6/A que en .NET.

---------------------------------------------------------------------
[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.VisualBasic (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
---

Oups je suis désolé banana! Je n'avais vu que ton poste de 17:21:11 ^^.
Je vais de suite voir ce que tu m'a dit!

Poste donc ton code complet. Là nous n'avons que ton code initial et des petites parties du nouveau. On ne peut pas deviner ce que tu as modifié entre temps

Désoler je vais manger et je reviens ^^.

Pourrais tu m'expliquer ces deux conseils s'il te plaît? Ce n'est pas pour rien que j'ai mis mon post dans le forum "Débutant" :D.

2 - dimensionner le buffer
3 - préparer le message et l'écrire dans le buffer

Pourrais tu m'expliquer ces deux conseils s'il te plaît? Ce n'est pas pour rien que j'ai mis mon post dans le forum "Débutant" :D.

Dans cette discussion j'avais montré un exemple avec du code commenté.
Peut-être pourras-tu t'en inspirer.

Bonjour,
excuser-moi du ma réponse tardive.

Voici donc le code côté serveur :
Option Explicit On
Option Strict On

Imports System.Net.Sockets
Imports System.Text

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


    Private Sub LancerServeur(sender As System.Object, e As System.EventArgs) Handles ButServ.Click
        serveur = New TcpListener(System.Net.IPAddress.Any, CInt(PortTxt.Text))
        serveur.Start()
        client = serveur.AcceptTcpClient()
        MessageBox.Show("Client connecté.")
        ButServ.Enabled = False
        PortTxt.Enabled = False
        Timer1.Start()
    End Sub


    Private Sub EnvoiMessage(sender As System.Object, e As System.EventArgs) Handles ButEnv.Click
        Try
            XStreamX = client.GetStream
            Dim SendBytes() As Byte = Encoding.UTF8.GetBytes("Serveur : " & MessageTxt.Text)
            XStreamX.Write(SendBytes, 0, SendBytes.Length)
            MessageBox.Show(SendBytes.ToString)
        Catch exep As Exception
            MessageBox.Show(exep.Message)
        End Try
    End Sub
End Class


Et le code côté client :
Option Explicit On
Option Strict On

Imports System.Net.Sockets
Imports System.Text

Public Class Form1

    Dim pseudo As String
    Dim client As New TcpClient
    Dim XStreamX As NetworkStream = Nothing

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

    Private Sub SeDéconnecter(sender As System.Object, e As System.EventArgs) Handles ButDeco.Click
        IPtxt.Enabled = True
        PORTtxt.Enabled = True
        PseudoTxt.Enabled = True
        ButCo.Enabled = True
        client.Close()
    End Sub

    Private Sub RecevoirMessage(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Dim Message As StringBuilder = New StringBuilder()
        Dim RecevoirBytes(client.ReceiveBufferSize) As Byte

        If client.Available > 0 Then
            Try
                XStreamX = 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
    End Sub
End Class

1 - De plus, ton serveur ne servira qu'un seul et unique client dans ce cas. 2 - Prévois une boucle afin d'accepter d'autres connexions.
3 - Je ne vois pas ce que fais Timer1 dans ton code (serveur).

Merci de tes renseignements, je vais voir cela tout de suite. Sinon pour le timer il servira pour recevoir les messages comme pour le client.


---------------------------------------------------
Je vous regarde !

C'est bon j'arrive à communiquer entre le client et le serveur, mais dès que je connecte un autre client le premier ce déconnecte, comme tu l'avais dit. J'ai entendu dire qui fallait créer un nouveau thread pour chaque client se connectant. Etant nouveau dans ce domaine, aurais-tu, ou quelqu'un d'autre, la patience et le courage d'essayer de m'en apprendre plus ?

De plus, j'ai envoyer le client à un de mes ami, je lui ai donné mon IP et pourtant il n'arrive pas à se connecter au serveur...


---------------------------------------------------
Je vous regarde !

J'ai entendu dire qui fallait créer un nouveau thread pour chaque client se connectant

On sort, là, du sujet de ce post. Valide celui-ci si il à répondu à ta question. Puis cherche sur le site, des sources à étudier utilisant des threads. Sinon il existe des cours en ligne pour apprendre à les utiliser.
A+

Et pour ton problème d'IP, vérifies firewalls, routeurs, anti-virus bloquants etc...

Ok je vais voir tout ça.
En tout cas encore merci à toi et à NHenri de votre aide et de votre patience !

Encore merci,
Sorpia.


---------------------------------------------------
Je vous regarde !