Utilisateur anonyme
-
19 mai 2012 à 10:53
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.
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.
Dans RecevoirMessage, il te manque la lecture des données pour remplir le buffer recevoirbytes -> xstreamx.read(recevoirbytes,.... après XStreamX = client.GetStream()
"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 ---
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
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 ---
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,
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 ---
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
---------------------------------------------------------------------
[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 ---
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
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 ---
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?
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 ---
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!
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.
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(...
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..."?