2011-10-14 3 views
0

Je me bats beaucoup avec ce code que j'essaie de mettre au travail. J'ai réussi à établir une connexion avec l'objet TcpClient à deux machines distantes séparées et à leur transmettre des données. Essentiellement, j'essaie de me connecter à la machine 1 sur le port 80 et envoyer une demande GET. Une fois que j'ai envoyé la demande, je veux garder la connexion en vie afin que le logiciel de l'autre côté puisse m'envoyer des données quand il est prêt. Comment garder la connexion ouverte et lire les données à chaque fois qu'elles sont disponibles dans le flux? J'ai essayé et essayé en utilisant NetworkStream.Read et BeginRead en vain. Le plus proche que je suis venu dormait mon fil toutes les 30 secondes et ensuite faire une autre requête GET qui n'est pas nécessaire. Voici le code actuel que j'ai pour lire dans le flux. Je sais que je dois une boucle ici quelque part:Comment utiliser .NET NetworkStream et TcpClient pour se connecter à une adresse IP distante et attendre les données?

Note: RemoteSocket est mon objet TcpClient qui est connecté par ce point

Dim serverStream As NetworkStream = RemoteSocket.GetStream() 
rqst = "GET /Control/Clip_Forwarding_Stream?CameraName=" & URL_Encode(Name) & " HTTP/1.0" & vbCrLf & vbCrLf 
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(rqst) 
serverStream.Write(stream, 0, stream.Length) 
Dim inStream(1024) As Byte 
Dim recv = serverStream.Read(inStream, 0, inStream.Length) 
Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv) 

Ce que je fais avec des données est passer à cette méthode:

Note: ForwardSocket est mon autre objet TcpClient qui est connecté par ce point

Dim serverStream As NetworkStream = ForwardSocket.GetStream() 
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(data) 
serverStream.Write(stream, 0, stream.Length) 

Tous les exemples peuvent être en C# ou VB comme je suis le plus à l'aise avec C# juste eu à écrire ce tout en VB.

Répondre

0

Vous devez lire dans une boucle (similaire à la réponse de NoAlias). Mais vous ne devriez pas simplement boucler jusqu'à ce que DataAvailable soit faux, car si, par souci d'arguement, vous aviez 4K de données, alors il y a une petite pause (congestion du réseau, peu importe) et puis 2K de données sont perdues. fin de vos données car DataAvailable aurait été faux dans cette pause. Au lieu de cela, vous devez vous appuyer sur le protocole de plus haut niveau, qui est dans ce cas le protocole HTTP. HTTP utilise un en-tête appelé Content-Length qui vous dira exactement combien d'octets seront présents dans le corps. Vous devez faire une boucle jusqu'à ce que vous ayez reçu cette quantité de contenu (ou que vous ayez atteint une valeur de délai d'expiration, à moins que vous ne souhaitiez attendre indéfiniment).

EDIT1

À la lecture de votre question, il semble que vous pouvez extraire des données qui n'a pas de longueur de contenu connue. HTTP prend en charge l'envoi de données par blocs en utilisant multipart. Ce n'est pas amusant de coder à la main, vous pouvez vouloir utiliser les classes HttpRequest et HttpResponse à la place pour gérer cela pour vous. Il met toujours à votre disposition un flux avec votre contenu, mais traite avec HTTP pour vous.

0
Do 

    Dim inStream(1024) As Byte 
    Dim recv = serverStream.Read(inStream, 0, inStream.Length) 
    Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv) 

Loop While serverStream.DataAvailable 

La méthode BeginRead10 peut également vous intéresser.

Questions connexes