Client server Vb .net

Signaler
Messages postés
17
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
7 mars 2010
-
Messages postés
1
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
6 décembre 2011
-
slt tout le monde,
je viens de devellopper une interface qui permets de comuniquer avec un pc distant via le reseau. En effet, au niveau de l'interface il y a une texte box dans laquelle on entre du texte et lorsque l'on clique sur envoi le message saisit apparait sur l'ecran hyperterminal de l'autre pc, ceci se fait via les fonctions sockets. Mon probleme est le suivant j'ai rajouté sur mon interface une deuxieme texte box dans laquelle j'aimerais recevoir des données dans le sens inverse , c'est à dire que lorsque je saisit de caractere au clavier de l'autre pc depuis hyperterminal j'aimerais que l'interface me les affiche dans la textebox n¨°2.
a l'heure d'aujourd'hui je n'arrive a recevoir qu'un seul cractere donc j'aimerais savoir ce que je pourrait faire pour pouvoir en recevoir plus voici mon code :

Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System.Text


Public Class Form1
Dim ecouteur As New TcpListener(port)
Dim client As New TcpClient
Dim Message As String = ""
Dim adressip As String
Dim port As Integer


Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Try
If Button5.Enabled = True Then
Try
adressip = TextBox2.Text
port = TextBox3.Text
client = New TcpClient(adressip, port)
Dim ecouteur As New TcpListener(port)
Catch ex As InvalidCastException
MessageBox.Show(ex.Message, "Erreur")
MessageBox.Show(" Veuillez spécifier la destination. ", "Erreur")
End Try

End If
Catch Ex As SocketException

MessageBox.Show(Ex.Message, "Erreur")
MessageBox.Show("Verifiez l'état de votre connexion", "Erreur")
End Try

End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
ecouteur.Stop()
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ListThread As New Thread(New ThreadStart(AddressOf Listening))
ListThread.Start()
End Sub



Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
End
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If Button4.Enabled = True Then
GroupBox1.Visible = True
End If
End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If Button1.Enabled = True Then
Try
Dim Writer As New StreamWriter(client.GetStream())
Writer.Write(TextBox1.Text)
Try
Writer.Flush()
Catch ex As IOException
MessageBox.Show(ex.Message, "Erreur")
MessageBox.Show("Veuillez recommencez.", "Erreur")
End Try
Catch ex As InvalidOperationException
MessageBox.Show(ex.Message, "Erreur")
MessageBox.Show("Veuillez vous connecter au client.", "Erreur")
End Try
End If

End Sub
Private Sub Listening()
ecouteur.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If ecouteur.Pending = True Then
Message = ""
client = ecouteur.AcceptTcpClient()
End If
End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Button2.Enabled = True Then
client.Close()
End If

End Sub

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If Button6.Enabled = True Then

Try
Dim Reader As New StreamReader(client.GetStream)
While Reader.Peek > 100
TextBox4.Text = Message + Convert.ToChar(Reader.Read()).ToString
End While
Catch ex As InvalidOperationException
MessageBox.Show(ex.Message, "Erreur")
MessageBox.Show("Veuillez vous connecter au client.", "Erreur")
End Try
End If

End Sub

End Class

6 réponses

Messages postés
17
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
7 mars 2010

merci d'avance
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Prends l'habitude de donner des noms parlant à tes boutons et autres TextBox, parce que là, difficile du premier coup d'oeil de savoir se qui se fait dans telle ou telle procédure.
Au final, seul "Button6_Click" concerne ta question, et par malchance, elle est à la fin.
Tout ceci pour dire qu'on perd du temps et que certains peuvent être découragés de lire une telle page.

Dans cette procédure, on trouve :
- Pas de lecture tant qu'il n'y a pas 100 Bytes dans le Buffer
Dommage.
Un "If" et un ce test "> 0" aurait suffit
- Le texte récupéré va dans TextBox4
Si ce n'est pas l'endroit où tu veux envoyer les données, changes-en.
Que représente "Message" ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
PS : Ton Socket génère t-il un évènement lorsqu'il reçoit des données ? (genre DataArrival en WinSock)
Ce serait quand même plus efficace que des boutons partout
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut,

Fais gaffe lorsque tu utilise des threads de ne pas faire d'opération inter-thread. Ton 'ecouteur' est créé et lu dans le thread principal mais sa méthode 'Start' est appelé dans le deuxième thread. Dans ton cas ça fonctionne car il n'y a aucune chance que les 2 thread accède à 'ecouteur' en même temps, mais si c'était le cas => plantage.
Tu devrais créer, écouter et lire ton 'ecouteur' dans un 2ème thread, et une fois une connection accepté, envoyer le client au thread principal. La classe System.Component.BackgroundWorker est idéal pour faire ce genre de trucs, elle permet de transferer tes clients par l'appel de BackgroundWorker.ReportProgress.

'Button6' sert donc à réceptionner les données? Et si tu le presse plusieurs fois de suite, tu recoit le reste du message?
Essaie un
TextBox4.Text = Message & Reader.ReadToEnd()
au lieu de
While Reader.Peek > 100

    TextBox4.Text = Message + Convert.ToChar(Reader.Read()).ToString

End While

et mets un 'If Not Reader.EndOfStream Then' devant

Pour mieux faire, tu pourrais lire et envoyer les données dans des threads séparés aussi, mais pour un petit chat avec des textes pas trop long ça va très bien comme ça
Et bon, sans oublier que pour un vrai prog du genre, tu devra gérer plusieurs clients, au max un par contact.
Messages postés
17
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
7 mars 2010

salut,
merci les gars pour vos réponses,
" Salut
Prends l'habitude de donner des noms parlant à tes boutons et autres TextBox, parce que là, difficile du premier coup d'oeil de savoir se qui se fait dans telle ou telle procédure.
Au final, seul "Button6_Click" concerne ta question, et par malchance, elle est à la fin.
Tout ceci pour dire qu'on perd du temps et que certains peuvent être découragés de lire une telle page." Sa marche pour moi Jack je m'en souviendrais pour la prochaine fois ;)

Cependant j'ai essayé les deux suggestions que vous m'avez conseillez cela ne marche pas. Quand je fais seulement la comparaison avec le if >0 je ne reçois plus aucun caractere.
Et quand j'essaie if not reader.endofstream then
textbox4.text=message & reader.readtoend
l'inteface plante .

cependant j'aurais en savoir plus concerant les deux pistes que vous me donner tous les deux a savoir l'evenement data arrival et faires des threads séparés.

Encore une fois merci les gars et à bientot j'espere.
Messages postés
1
Date d'inscription
dimanche 30 octobre 2011
Statut
Membre
Dernière intervention
6 décembre 2011