Avatar billede lasserasch Juniormester
14. september 2010 - 22:35 Der er 4 kommentarer og
1 løsning

Tjek status / procent på Socket Recieve.

Hejsa.

Har følgende metode til at modtage data fra min Socket Server.

private void StartRecieve()
        {
            while (true)
            {

                try
                {
                    Byte[] receive = new Byte[102400000];
                    int ret = s.Receive(receive, receive.Length, 0);
                    if (ret > 0)
                    {
                        IFormatter iformat = new BinaryFormatter();

                        MemoryStream Memstream = new MemoryStream(receive);
                        Memstream.Position = 0;
                        /// Server.Server.ServerResponse er et objekt som jeg har lavet og arbejder med.
                        Server.Server.ServerResponse response = (Server.Server.ServerResponse)iformat.Deserialize(Memstream);

                      /// Fjernet den kode som behandler indkomne data for at skabe bedre overblik.
                    }

                }
                catch { }

            }
            t.Abort();
        }


Jeg bruger det til nogle klienter som har ekstremt lidt båndbredde men stadig skal kunne kommunikere med en SQL Server.

På en central server ligger en applikation jeg har bygget, som modtager en forespørgelse fra mine klienter. Serveren spørger så ned i SQL serveren og danner derfra et objekt som den herefter serialiserer og sender retur til klienten.

Det går MEGET hurtigere end direkte SQL adgang fra klienterne.

Funktionaliteten virker helt som den skal, men jeg kunne godt tænke mig at vide hvor mange af de data der bliver sendt retur fra min server som er overført. Altså en slags status rapportering.

Er der nogen som har en ide omkring om det kan lade sig gøre og i så fald hvordan?


Mvh.
Lasse
Avatar billede bvli Praktikant
14. september 2010 - 23:30 #1
Du kunne måske på serveren skrive en long med længden af de samlede data ned som det første i din respons. På klienten kunne du starte med at læse den long før du giver data videre til din stream.

Noget a'la (ej testet eller compilet):

--- client ---

IFormatter formatter = new BinaryFormatter();
byte[] size = new byte[sizeof(long)];
s.Receive(size, size.Length, 0);
long totalSize = BitConverter.ToInt64(size, 0);

int bufferSize = 4096; //Juster selv buffersize mht performance og progressReporting
byte[] buffer = new byte[bufferSize];

long totalBytesRead = 0;
int bytesRead = 0;
using (MemoryStream ms = new MemoryStream()){
    while ((bytesRead = s.Receive(buffer, buffer.Length, SocketFlags.None) > 0)
    {
        totalBytesRead += bytesRead;
        ms.Write(buffer, 0, bytesRead);
        //Report progress.
        //Her har du totalSize og totalBytesRead.
                ReportProgress(totalBytesRead*100/totalSize);
    }
    ServerResponse response = formatter.Deserialize(ms) as ServerResponse;
    //
    //
}

--- server ---
IFormatter formatter = new BinaryFormatter();
Server responseObject = GetMySqlResponse();
using (MemoryStream ms = new MemoryStream())
{
    formatter.Serialize(ms, responseObject);   
    byte[] content = ms.ToArray();
    byte[] size = BitConverter.GetBytes(content.Length);
    socket.Send(size, SocketFlags.None);
    socket.Send(content, SocketFlags.None);
}
Avatar billede bvli Praktikant
14. september 2010 - 23:31 #2
nå ja - det skulle ikke have været som svar - kun kommentar..
Avatar billede bvli Praktikant
22. september 2010 - 12:21 #3
Det var ikke noget du kunne bruge til noget?
Avatar billede lasserasch Juniormester
22. september 2010 - 13:44 #4
Hej bvli.

Jo, det var det helt sikkert. Har lavet lidt om på det og skulle lige have det testet i mit multithread setup.

Efter et par forsøg spiller det bare max :-)

Smid et svar for points. Og tak for hjælpen.



Mvh.
Lasse
Avatar billede bvli Praktikant
22. september 2010 - 14:40 #5
Super :) Der er allerede svar i tråden.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester