2010-04-17 4 views
1

Vb.netEnvoi par jpegs prise tcp ... parfois incomplète

Salut

Je travaille sur un projet depuis des mois (vb express de 2008). Il y a un dernier problème que je ne peux pas résoudre.

Je dois envoyer des images à un client à partir d'un «serveur» (écouteur). Le code ci-dessous fonctionne la plupart du temps mais parfois l'image est incomplète. Je crois que cela pourrait être quelque chose à voir avec les tailles de paquets tcp variant, peut-être limitée par la façon dont il est occupé sur le net. I ont vu des exemples de code qui divisent l'image en morceaux et les envoie, mais je ne peux pas les faire fonctionner parce que j'utilise une autre version de vb. Les images à envoyer sont petites 20k max.

Tout exemple de code de travail serait merveilleux. J'ai expérimenté et échoué avec ce dernier obstacle pendant des semaines.

Merci d'avance.

client -----

Sub GetPic() 


     '------- Connect to Server 
     ClientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, _ ProtocolType.Tcp) 
     ClientSocket.Connect(Epoint) 

     '------- Send Picture Request 
     Dim Bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes("Send Picture") 
     ClientSocket.Send(Bytes, Bytes.Length, SocketFlags.None) 

     '------- Receive Response 
     Dim RecvBuffer(20000) As Byte 
     Dim Numbytes As Integer 

     Numbytes = ClientSocket.Receive(RecvBuffer) 

     Dim Darray(Numbytes) As Byte 
     Buffer.BlockCopy(RecvBuffer, 0, Darray, 0, Numbytes) 

     '------- Close Connection 
     ClientSocket.Shutdown(SocketShutdown.Both) 
     ClientSocket.Close() 

     '------- 
     Dim MStrm = New MemoryStream(Darray) 
     Picture = Image.FromStream(MStrm) 


End Sub 

Listener -----

'Threaded from a listener 


    Sub ClientThread(ByVal Client As TcpClient) 

     Dim MStrm As New MemoryStream 
     Dim Rbuffer(1024) As Byte 
     Dim Tbyte As Byte() 
     Dim NStrm As NetworkStream = Client.GetStream() 

     Dim I As Integer = NStrm.Read(Rbuffer, 0, Rbuffer.Length) 
     Dim Incoming As String = System.Text.Encoding.ASCII.GetString(Rbuffer, 0, I) 

     If Incoming = "Send Picture" then 
        Picture Save(MStrm, Picture.RawFormat) 
        Tbyte = MStrm.ToArray 
        NStrm.Write(Tbyte, 0, Tbyte.Length) 
       End if 

     Client.Close() 

End Sub 

Répondre

1

la façon dont vous obtenez votre image est tout à fait tort, faire comme ceci:

Numbytes = ClientSocket.Receive(RecvBuffer) 

vous avez une chance d'obtenir une partie des données, parce que le socket peut en fait avoir une plus petite quantité que l'image complète dans son tampon. Quoi qu'il en soit essayer recevoir comme ça (je vais donner l'échantillon en C#):

MemoryStream responseStream = new MemoryStream(); 
byte[] recvBuffer = new recvBuffer[4096]; // just some size 
int read = 0; // indicates how much data actually read from socket, can be smaller then buffer 
do{ 
    read = ClientSocket.Receive(recvBuffer); // recieve data 
    responseStream.write(recvBuffer, 0, read); // write it to resposne stream for later use 
} 
while(read != 0); 

Cela devrait faire le travail, mais je ferais un peu autrement dans votre cas. Voici le code client:

Socket s = new Socket(blablabla); 
s.Connect(endPoint); 
NetworkStream clientStream = new NetworkStream(s); 
clientStream.Write("Send picture"); // send a command to server 

int pictureSize = clientStream.ReadInt(); // here we expect to read following picture's size 
byte[] pictureBuffer = clientStream.ReadBytes(pictureSize); 

et le serveur, une partie de l'auditeur:

Socket serverSocket = new Socket(blablabla); 
serverSocket.Bind(blabla); 
serverSocket.Listen(100); 

while(true){ 
    Socket clientSocket = serverSocket.Accept(); 
    Thread t = new Thread(new ParametrizedThreadStart((object Obj) => 
    { 
     Socket clientSocket = (Socket)Obj; 
     NetworkStream clientStream = new NetworkStream(clientSocket); 
     string command = clientStream.ReadString(); 
     if(command == "Send picture"){ 
      // get ur picture here 
      // get it's size 
      clientStream.Write(pictureSize); 
      clientStream.Write(pictureBytes); 
     } 
    })); 
    t.start(clientSocket); 
} 

J'espère que ce code pseudo est clair, ne hésitez pas à poser des questions :)

Questions connexes