Avatar billede misbruger Nybegynder
11. december 2002 - 22:20 Der er 8 kommentarer og
1 løsning

Langsom socket handler

Jeg er ved at lave en webapplikation, som skal kommunikere med en "gammeldags" webservice.
Webservicen er lavet i cgi, og kører på en Solaris 5.7

Til det har jeg lavet en method der sender en function til en given ip-addresse, på en given port, for derefter at modtage en stream af bytes, og returnerer den som en string.

Mit problem er umiddelbart at ligegyldigt hvor mange bytes jeg modtager, tager det altid 5 sek.

Dem som har udviklet webservicen jeg kommunikere med, påstår at de har lavet en cgi applikation, som klare samme på 0,7 sek.

Derfor vil jeg hører om der er nogen der umiddelbart kan se hvorfor nedenstående method tager 5 sek. ???

public static string getSocket(string function)
{
    string server = "XX.XXX.XX.XXX";
    int port = XXXX;
    //Sets up variables and a string to write to the server
    Encoding ASCII = System.Text.ASCIIEncoding.GetEncoding(1252);
    Byte[] ByteGet = ASCII.GetBytes(function);
    Byte[] RecvBytes = new Byte[5120];
    String strRetPage = null;
   
    // IPAddress and IPEndPoint represent the endpoint that will
    //  receive the request.
    // Get the first IPAddress in the list using DNS.
    IPAddress hostadd = Dns.Resolve(server).AddressList[0];
   
    IPEndPoint EPhost = new IPEndPoint(hostadd, port);

    //Creates the Socket for sending data over TCP.
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
   
    // Connects to the host using IPEndPoint.
    s.Connect(EPhost);
    if (!s.Connected)
    {
        strRetPage = "Unable to connect to host";
        new ExceptionHandler(strRetPage);
    }
    else
    {
        // Sends the GET text to the host.
        s.Send(ByteGet, ByteGet.Length, SocketFlags.None);

        // Receives the page, looping until all bytes are received
        Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
        strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);

        while (bytes > 0)
        {
            bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);
            strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);
        }
    }
    return strRetPage;
}
Avatar billede simon.ulsnes Nybegynder
11. december 2002 - 22:52 #1
Hmmm... Jeg ved ikke om det har noget med dit problem at gøre, men linjen:
new ExceptionHandler...
skal erstattes med:
throw new Exception(strRetPage);

Har du prøvet at gøre det samme med TcpClient?

// Simon
Avatar billede cms Nybegynder
11. december 2002 - 23:46 #2
Benyt System.Text.StringBuilder istedet for at konkatenere strenge som du gør det (strRetPage += xyz)
Avatar billede simon.ulsnes Nybegynder
12. december 2002 - 07:17 #3
Det burde altså ikke tage 5 sek. at gøre det sådan, men ja, StringBuilder-metoden er mere effektiv...

StringBuilder sb = new StringBuilder("");
sb.Append("Hejsa\n");
sb.Append("Jubiii!\n");
sb.Append("Sikke vi kan.");

// Simon
Avatar billede cms Nybegynder
12. december 2002 - 08:27 #4
Nej-nej selvfølgelig ikke =) Men mange bække små... Man kan da ligeså godt gøre koden helt optimal.
Avatar billede cms Nybegynder
12. december 2002 - 08:29 #5
Men, misbruger (find et andet nick, iøvrigt), kan du ikke splitte koden op sådan at du begynder med at afvikle kun første linje, dernæst 1.+2., så 1.+2.+3. osv., for at se, hvilken operation der sluger meget tid.
Avatar billede misbruger Nybegynder
12. december 2002 - 09:44 #6
new ExceptionHandle(strRetPage) er min custom exception handler....

Tjo! Jeg kunne sagtens benytte stringbuilder, men at tror det giver den helt store forskel..... Hmmm!

Det som er mystisk er at det er ligegyldigt om jeg kun modtager en dato retur, eller 10 kb. data, det tager altid 5 sek.....

Mit problem er umiddelbart at den webapplikation jeg laver modtager alle de forskellige forms dataer fra denne service, nogle gange over et kald, men andre gange over 3 kald, og det er jo temlig useriøst hvis brugeren skal vente 15 sek.....!
Avatar billede cms Nybegynder
12. december 2002 - 17:24 #7
Kan du ikke lave en klient i c++ fx, og se om samme problem opstår der?
Avatar billede misbruger Nybegynder
12. december 2002 - 21:05 #8
jeg kan ikke programmerer C++ !
Avatar billede misbruger Nybegynder
17. december 2002 - 22:06 #9
Hmmmm jeg lukker spm.

Såfremt der er nogle der har nogle gode bud er jeg dog stadig interesseret, da jeg ikke har fået løst problemmet...?
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