Avatar billede casualty Nybegynder
05. juni 2004 - 20:56 Der er 14 kommentarer og
1 løsning

Streaming af bytes via. sockets. Optimering

Jeg modtager bytes fra en socket således

kbDownloadet = 0;
      runCalculator = true;
      TcpClient client = new TcpClient();
      client.Connect(ip, port);
      NetworkStream stream = client.GetStream();
      byte[] bytes = new byte[bytesToRead];
      downloadChild.ProgressBarMax = ((int)bytesToRead);
      ThreadStart threadStart = new ThreadStart(this.SpeedCalculator);
      Thread t = new Thread (threadStart);
      t.Name = "SpeedcalculatorThread";
      t.Start();
      int j = 0;
      for(int i=0; i<bytesToRead; i++){
        j++;
        if(cancelled){
          break;
        }
        Thread.Sleep(0);
        bytes[i] = (byte)stream.ReadByte();
        if(j==10000){
          kbDownloadet = ((i+1)/1000);
          downloadChild.ProgressLabelText = "Downloading "+((i+1)/1000)+" Kb of "+((bytesToRead-1)/1000)+" Kb";
          downloadChild.ProgressBarValue = (i+1);
          j=0;
        }
      }
      runCalculator = false;
      stream.Close();
      client.Close();
      if(!cancelled){
        downloadChild.ProgressLabelText = "Finished";
        downloadChild.ProgressBarValue = downloadChild.ProgressBarMax;
        FileStream fstream = new FileStream(SingletonSettingsHandler.GetInstance().DownloadDirectory+"\\"+fileName, FileMode.Create, FileAccess.Write);
        fstream.Write(bytes,0,(int)bytesToRead);
        fstream.Close();
      }
      else{
        downloadChild.ProgressLabelText = "Cancled by user";
      }
      Thread.Sleep(1000);
      downloadChild.DownloadHasEnded();

Kan man ikke gøre det bedre? rent performancemæssigt?
Jeg kan med dette kode ikke overføre bytes hurtigere end 200 kb/s.
Jeg så noget kode på et tidspunkt hvor man læste og lagde til en buffer som samtidig skrev til en fil... jeg vil jo også støde ind i problemer når man skal overføre flere bytes end der kan være i et array...

Mvh Casualty
Avatar billede casualty Nybegynder
05. juni 2004 - 20:57 #1
Jeg har testet om udskrivning til GUI sløver... Men det gør det ikke når jeg kun skriver til GUI ved hvert 10kb...
Avatar billede arne_v Ekspert
05. juni 2004 - 21:07 #2
Prøv og erstat løkken med stream.ReadByte() med nogle stream.Read(bytes,ix,bytes.Length-ix);
Avatar billede casualty Nybegynder
05. juni 2004 - 21:09 #3
Og stadig en løkke?
Avatar billede arne_v Ekspert
05. juni 2004 - 21:10 #4
fil : nej
socket : ja

den returnerer antal læse bytes som ix så kan tælles op med
Avatar billede casualty Nybegynder
05. juni 2004 - 22:58 #5
int bytesDownloadet=0;
int count =0;
while ((count = stream.Read(bytes,0,(int)bytesToRead)) != 0){
  bytesDownloadet += count;
  downloadChild.ProgressBarValue = (bytesDownloadet);
  downloadChild.ProgressLabelText = "Downloading "+((bytesDownloadet)/1024)+" Kb of "+((bytesToRead-1)/1024)+" Kb";
}

Sådan gjorde jeg... men så hiver den jo alle bytes på en gang... jeg ville gerne kunne vise det i min progressbar... Hvad kan jeg gøre?
Avatar billede arne_v Ekspert
05. juni 2004 - 23:00 #6
Skal

while ((count = stream.Read(bytes,0,(int)bytesToRead)) != 0){

ikke være

while ((count = stream.Read(bytes,bytesDownloadet,(int)bytesToRead)) != 0){

?
Avatar billede arne_v Ekspert
05. juni 2004 - 23:01 #7
Umiddelbart ville jeg forvente at den ved en socket læste det i flere klumper.

Men ellers så bruger du bare:

while ((count = stream.Read(bytes,bytesDownloadet,(int)bytesToRead/25)) != 0){

for at få det i 25 klumper.
Avatar billede casualty Nybegynder
06. juni 2004 - 19:35 #8
Jo du har nok fat i noget der..

men kan du forklare mig, hvorfor skal jeg i C# skrive således?

while ((count = stream.Read(bytes,bytesDownloadet,(int)bytesToRead)) != 0)

i stedet for

while ((count = stream.Read(bytes,bytesDownloadet,(int)bytesToRead)) != -1)

I java har jeg brugt -1 med godt resultat, men det giver en uendelig løkke i C#
Avatar billede arne_v Ekspert
06. juni 2004 - 22:13 #9
Stream.Read Method

Return Value
The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if the end of the stream has been reached.

----

read

public int read(byte[] b,
                int off,
                int len)
        throws IOException

    Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read, possibly zero. The number of bytes actually read is returned as an integer.

    This method blocks until input data is available, end of file is detected, or an exception is thrown.

    If b is null, a NullPointerException is thrown.

    If off is negative, or len is negative, or off+len is greater than the length of the array b, then an IndexOutOfBoundsException is thrown.

    If len is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at end of file, the value -1 is returned; otherwise, at least one byte is read and stored into b.

----

Tja - hvad skal jeg sige - sådan er det bare.
Avatar billede casualty Nybegynder
10. juni 2004 - 15:48 #10
Jeg har ikke glemt dette spørgsmål... Jeg skal bare lige over eksamen...

Casualty
Avatar billede arne_v Ekspert
10. juni 2004 - 18:40 #11
Helt fint - vi når det nok
Avatar billede arne_v Ekspert
10. juni 2004 - 18:41 #12
Men jeg ligger lige et svar
Avatar billede arne_v Ekspert
16. juni 2004 - 22:06 #13
Gik det godt til eksamen ?
Avatar billede casualty Nybegynder
16. juni 2004 - 22:54 #14
Jo tak 2*10 + 11 så jeg klager ikke :)
Avatar billede arne_v Ekspert
16. juni 2004 - 22:56 #15
Hvis du klagede over det var du også et skarn ...  :-)
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