SORU
14 Kasım 2011, PAZARTESİ


Nasıl ve sunucu tarafında WebSocket mesajlar gönderip alabilir miyim?

  • Nasıl ve protokole göre sunucu tarafında WebSocket kullanarak iletileri göndermek ve almak, alabilir miyim?

  • Neden tarayıcıdan sunucuya veri gönderdiğim zaman sunucuda rastgele bayt alabilirim? Bu verileri bir şekilde kodlanmış?

  • Nasıl çerçeve hem sunucu &yani; istemci &yani; sunucu yönde de çalışır mı?

CEVAP
14 Kasım 2011, PAZARTESİ


Not: Bu kesin bir çerçeve biçimi olarak başına gelen ve outcoming WebSocket iletileri de işleyebilir bu çok önemsiz bir sunucuya uygulamak için nasıl bir açıklama ve yalancı. Anlaşma süreci içermez. Ayrıca, bu cevap, eğitim amacıyla yapılmış; tam özellikli bir uygulama değildir.

Specification (RFC 6455)


Mesaj göndermek

(Diğer bir deyişle, sunucu &yani; tarayıcı)

Senin gönderdiğin Kare WebSocket çerçeve biçimine göre biçimlendirilmiş olması gerekiyor. Mesaj göndermek için, bu biçimi aşağıdaki gibidir:

  • veri tipi (ve kapsam dışı olan bazı ek bilgiler önemsiz bir sunucu için) içeren bir bayt
  • uzunluğu içeren bir bayt
  • iki veya sekiz bayt ise ikinci uzunluğu bayt uygun değilse (ikinci bayt sonra kodu kaç bayt uzunluğu için nasıl kullanıldığını söylüyor)
  • (raw) gerçek veriler

İlk byte 1000 0001 (129) metin çerçevesi için olacak.

İkinci bayt ilk bit veri kodlama değiliz çünkü 0 (istemci sunucudan kodlama zorunlu değil) vardır.

Uzunluk bayt doğru göndermek için ham veri uzunluğunu belirlemek için gereklidir:

  • 0 <= length <= 125 eğer ek bayt gerek yok
  • 126 <= length <= 65535 iki ek bayt gerekir ve ikinci bayt ise 126
  • length >= 65536, eğer sekiz ek bayt gerekir, ve ikinci bayt 127

Uzunluğu olmalı dilimlenmiş ayrı bayt, yani seni gerek bit-shift hakkı (bir miktar sekiz bit), ve sonra sadece korumak son sekiz bit yaparak AND 1111 1111 (255).

Uzunluğu, bayt(s) sonra gelen ham veriler.

Bu aşağıdaki yarı kod yol açar:

bytesFormatted[0] = 129

indexStartRawData = -1 // it doesn't matter what value is
                       // set here - it will be set now:

if bytesRaw.length <= 125
    bytesFormatted[1] = bytesRaw.length

    indexStartRawData = 2

else if bytesRaw.length >= 126 and bytesRaw.length <= 65535
    bytesFormatted[1] = 126
    bytesFormatted[2] = ( bytesRaw.length >> 8 ) AND 255
    bytesFormatted[3] = ( bytesRaw.length      ) AND 255

    indexStartRawData = 4

else
    bytesFormatted[1] = 127
    bytesFormatted[2] = ( bytesRaw.length >> 56 ) AND 255
    bytesFormatted[3] = ( bytesRaw.length >> 48 ) AND 255
    bytesFormatted[4] = ( bytesRaw.length >> 40 ) AND 255
    bytesFormatted[5] = ( bytesRaw.length >> 32 ) AND 255
    bytesFormatted[6] = ( bytesRaw.length >> 24 ) AND 255
    bytesFormatted[7] = ( bytesRaw.length >> 16 ) AND 255
    bytesFormatted[8] = ( bytesRaw.length >>  8 ) AND 255
    bytesFormatted[9] = ( bytesRaw.length       ) AND 255

    indexStartRawData = 10

// put raw data at the correct index
bytesFormatted.put(bytesRaw, indexStartRawData)


// now send bytesFormatted (e.g. write it to the socket stream)

Mesaj alma

(Diğer bir deyişle, tarayıcı &yani; sunucu)

Elde ettiğimiz kareleri aşağıdaki biçimdedir:

  • veri türü içeren bir bayt
  • uzunluğu içeren bir bayt
  • ya uzunluğunda iki ya da sekiz ek bayt ikinci bayt uymadı
  • Maskeler (= anahtarları kod çözme) dört bayt
  • gerçek veriler

İlk bayt genellikle önemli değildir - sadece metin göndermek istiyorsanız, sadece metin türü kullanıyor. 1000 0001 (129) bu durumda olacak.

İkinci bayt ve iki ya da sekiz ek bayt kaç bayt uzunluğu (gerçek veri başladığı bilmeniz gerekir) için nasıl kullanıldığını bilmen lazım çünkü bazı ayrıştırma lazım. Uzunluğu kendisi verileri çoktan beri genellikle gerekli değildir.

İkinci bayt ilk bit veri maskeli olduğu anlamına gelir her zaman 1 (=kodlanmış). Sunucuya istemciden gelen mesajları hep maskeli. secondByte AND 0111 1111 yaparak ilk bit kaldırmak gerekir. İkinci bayt sığmadı çünkü ortaya çıkan bayt uzunluğu temsil etmez, iki durum vardır:

  • 0111 1110 126, ikinci bir bayt aşağıdaki iki bayt uzunluğu için kullanılır anlamına gelir
  • 0111 1111 127, ikinci bir bayt aşağıdaki sekiz bayt uzunluğu için kullanılır anlamına gelir

Dört maske bayt gönderilen gerçek veri kod çözme için kullanılır. Kod çözme algoritması aşağıdaki gibidir:

decodedByte = encodedByte XOR masks[encodedByteIndex MOD 4]

encodedByte olduğu veri orijinal bayt, encodedByteIndex dizin (ofset) byte ilk byte saymagerçek veri25* *dizin vardır., masks bir dizi dört maske bayt içerir.

Bu kod çözme için: aşağıdaki sözde kod yol açar

secondByte = bytes[1]

length = secondByte AND 127 // may not be the actual length in the two special cases

indexFirstMask = 2          // if not a special case

if length == 126            // if a special case, change indexFirstMask
    indexFirstMask = 4

else if length == 127       // ditto
    indexFirstMask = 10

masks = bytes.slice(indexFirstMask, 4) // four bytes starting from indexFirstMask

indexFirstDataByte = indexFirstMask   4 // four bytes further

decoded = new array

decoded.length = bytes.length - indexFirstDataByte // length of real data

for i = indexFirstDataByte, j = 0; i < bytes.length; i  , j  
    decoded[j] = bytes[i] XOR masks[j MOD 4]


// now use "decoded" to interpret the received data

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AFISHAL

    AFISHAL

    7 Mart 2009
  • Gali B

    Gali B

    1 EYLÜL 2006
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005