2011-10-29 3 views
0

Je réalise une application de chat .NET mais j'ai toujours cette erreur: Je ne peux envoyer qu'un message par connexion. Par exemple. Avec le code ci-dessous, je peux envoyer seulement un message qui peut être reçu correctement par l'autre pair, mais si j'envoie un autre message de message, sur la même connexion, il ne sera pas reçu par le PC à distance. Voici le code:Problèmes Envoi de messages avec TCPClient dans vb.net

Dim client_TCP As New TcpClient 
Private Sub send_obj(ByVal obj As Object) 
    Dim bf As New BinaryFormatter 
    Dim tosend As Packet 

    tosend.data = obj 
    bf.Serialize(client_TCP.GetStream(), tosend) 
    client_TCP.GetStream.Flush() 
End Sub 
Private Sub connect_to_port() 
    Try 
     client_TCP = New TcpClient(client_data.getIP(), client_data.getPort()) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

End Sub 
Private Sub disconnect_from_port() 
    client_TCP.Close() 
End Sub 

Et est ici l'auditeur:

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer.Tick 
    If client_TCP_listener.Pending = True Then 

     .... 
    End If 
End Sub 

Ainsi, pour envoyer un message que je toujours besoin de le faire (par exemple):

Dim b As Byte 
    b = 1 
    disconnect_from_port() 
    connect_to_port() 
    client_TCP.GetStream().WriteByte(b) 
    client_TCP.GetStream().Flush() 

I essayé de mettre \ supprimer le flush à la fois le code. Rien ne s'est passé. Avez-vous des idées ?!

Répondre

0

Comment savez-vous qu'il n'est pas reçu? Avez-vous essayé d'émuler l'hôte distant avec votre propre code? TCP est un protocole de flux qui signifie que vous pouvez envoyer deux octets en effectuant deux appels distincts à client_TCP.GetStream(). WriteByte (b) et la partie distante peut recevoir ces 2 octets en utilisant un appel Receive. Vous ne devez faire aucune supposition sur les modèles d'appels de l'API d'E/S (nombre d'écritures et nombre de réceptions) mais analyser les données que vous envoyez en recevant une connexion en flux.

Donc, pour envoyer des messages en utilisant le protocole de flux, vous devez introduire la notion de protocole d'application. Par exemple [2bytes-size] [taille-octets du message] - ce qui signifie que si nous voulons envoyer un message "bonjour" nous enverrons d'abord 2 octets contenant la taille de la chaîne "hello" puis la chaîne elle-même.

0

assurez-vous que la réception utilise également .net BinaryFormatter pour déserlibrer l'objet.