Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Chunked content

Postad 2004-05-25 av Simon Dahlbacka i sektionen ASP.NET, C#, Okategoriserat med 0 Kommentarer | Läst av: 5568, Betyg: 87%

Förord

Ibland tar det länge att skapa/få fram informationen för en webbsida, och då kan det vara bra att skicka information till användaren redan innan hela sidan är klar. Detta är möjligt genom att använda sej av sk. Chunked transfer i HTTP. Exemplen i denna artikel är skrivna är skrivna i PHP men torde enkelt gå att applicera även på andra språk.
Innehåll
  » Transfer-Encoding: chunked?
  » Skillnad mellan vanlig överföring och bitvis överföring
  » Vad händer bakom kulisserna?
  » Potentiella användningsområden
  » Ja, ja.. vi vill se ett exempel nu!
  » Gotchas..


Transfer-Encoding: chunked?

Chunked transfer betyder att datan överförs i bitar. HTTP (hypertext transfer protocol) version 1.1 specifierar att alla som implementerar version 1.1 MÅSTE stöda chunked transfer. Detta innebär i praktiken att alla nutida servrar och klienter stöder denna teknik.


Skillnad mellan vanlig överföring och bitvis överföring

Skillnaden hittas bland headersen, bitvis överföring specificerar Transfer-Encoding: chunked men ingen Content-Length. Medan "vanlig överföring" kräver att en korrekt specificerad Content-Length header finns specificerad, detta för att "persistenta uppkopplingar" (persistent connection) skall kunna fungera.


Vad händer bakom kulisserna?

Det fungerar som så att kontakten mellan klient och server hålls uppe tills all data är skickad. I stället för att servern skickar hela sidan på en gång, så skickas den i lämpliga delar.
För att veta var bitarna börjar och slutar så måste längden på innehållet vara specificerat. Normalt används en Content-length header.
Men eftersom headers per definition ska komma före datan, så kan vi inte skicka längden på data som vi inte vet längden på innan vi skickat all data, innan vi börjat skicka data.
I stället kodas varje del så här:

antal_bytes_hexadecimalt CRLF
data CRLF

Där CR står för ascii tecknet carriage return (0xD) och LF står för ascii tecknet line feed (0xA). Den sista biten meddelas med hjälp av en bit (chunk) med längden 0.


Potentiella användningsområden

Detta är inte en fullständig lista, men kan kanske ge några ideer:

  • Chatt
  • Uppdatera en "progressbar" innan sidan är klar att visa
  • Visa delar så fort dom är klara på en sida som hämtar information från olika nätsidor, typ "multi-sök sida".
  • ...



Ja, ja.. vi vill se ett exempel nu!

Vi tänker oss att vi kommer på den (befängda) idén att göra en klocka m.h.a. denna teknik. Vi tänker oss då att vi varje sekund skicka en kodsnutt som uppdaterar en "klocka" på en webbsida. Naturligtvis är detta inte ett vettigt användningsområde, eftersom det finns enklare sätt att lösa det hela på, samt att varje klient kräver en konstant ansluting (persistent connection) till servern. Men detta är som sagt endast ett exempel.

Eftersom php per default skickar chunked content, så behöver vi inte göra något speciellt för att få det att fungera, men detta betyder också att exemplet ser relativt trivialt ut.

Vi vill använda följande html sida som bas för klockan:



Klocka


Klocka


??:??:??





För att uppdatera innehållet i div:en med id "klocka" använder vi oss av följande teknik. Vi använder standardenligt getElementByIdför att hitta vår div. Därefter använder vi oss av en icke-standard property .innerHTML (som dock stöds av "alla" browsers) för att ändra på innehållet.

document.getElementById("klockan").innerHTML = ;


Alltså, för att vår klocka ska fungera som väntat bör vi varje sekund skicka en kodsnutt som m.h.a. ovanstående javascript uppdaterar "klockan" (dvs. div:en med id "klockan")

set_time_limit(0);

while (true) {
sleep(1);//sov 1 sekund så att vi skickar en kodsnutt i sekunden (ungefär)
print "<script type='text/javascript'>\r\n";
print "document.getElementById('klockan').innerHTML = '".date("H:i:s")."';\r\n";
print "</script>\r\n";

//töm buffern och skicka allt till klienten NU.
flush();
//om ifall du har output buffering påkopplat kan även följande behövas
//ob_flush();
?>
}


På tråden kommer överföringen av en del alltså att se ut som följande, (längden av datan från och med <script..> till och med \r\n efter </script> är 104 tecken, dvs 68 hexadecimalt)

68\r\n
<script type='text/javascript'>\r\n
document.getElementById('klockan').innerHTML='hh:mm:ss';\r\n
</script>\r\n\r\n


Den sista delen ser ut så här:

0\r\n



Gotchas..


  • Vissa källor tyder på att browsern vill ha åtminstone 256bytes / chunk innan den börjar rendera, detta har jag inte märkt av men kan vara bra att hålla i minne ändå.
  • Dessutom kan man inte skicka data hur som helst inuti en tabell, åtminstone en rad (..) bör man skicka.
  • Som nämts flera gånger tidigare upprätthålls kontakten mellan klient och server ända tills hela sidan är skickad.


Det var allt.

PS. Som vanligt mottages kritik, tips, förslag osv.. med tacksamhet!
Upp

0 Kommentarer

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 155
27 952
271 704
632
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies