Socket.IO, gerçek zamanlı web uygulamaları için bir JavaScript kütüphanesidir. Web istemcileri ile sunucular arasında gerçek zamanlı, iki yönlü iletişim sağlar. İki bölümden oluşur: tarayıcıda çalışan bir istemci tarafı kütüphanesi ve Node.js için bir sunucu tarafı kütüphanesi. Her iki bileşen de neredeyse aynı API'ye sahiptir. Node.js gibi, olay güdümlüdür.
0: open (Yeni bir transport açıldığında sunucudan gönderilir (yeniden kontrol))
1: close (Bu transport'un kapatılmasını ister ancak bağlantının kendisini kapatmaz.)
2: ping (İstemci tarafından gönderilir. Sunucu, aynı veriyi içeren bir pong paketi ile yanıt vermelidir)
örnek
istemci gönderir: 2probe
server sends: 3probe
3: pong (ping paketlerine yanıt vermek için sunucu tarafından gönderilir.)
4: string mesaj (gerçek mesaj, istemci ve sunucu geri çağrılarını verilerle çağırmalıdır.)
example:
42/chat,[“join”,”{room:1}"]
4, engine.io protokolündeki mesaj paketi türüdür
2, socket.io protokolündeki EVENT türüdür
/chat, socket.io tarafından işlenen veridir
socket.io "join" olayını tetikleyecektir
"room: 1" verisini geçirir. Ad alanını (namespace) yalnızca / olduğunda atlamak mümkündür.
5: upgrade (engine.io bir aktarımı değiştirmeden önce, sunucu ve istemcinin bu aktarım üzerinden iletişim kurup kuramayacağını test eder. Bu test başarılı olursa, istemci sunucudan eski aktarımdaki önbelleğini boşaltmasını ve yeni aktarıma geçmesini isteyen upgrade paketleri gönderir.)
6: noop (Bir noop paketi. Öncelikle bir gelen WebSocket bağlantısı alındığında bir yoklama döngüsünü zorlamak için kullanılır.)
API: SocketIO sürümünü belirtir:
ioAPI0: socket.io 0.* sunucularını destekler (varsayılan olarak seçilidir)
ioAPI1: socket.io 1.* sunucularını destekler
ioAPI2: socket.io 2.* sunucularını destekler
ioAPI3: socket.io 3.* sunucularını destekler
ioAPI4: socket.io 4.* sunucularını destekler
Base64: etkinleştirilirse, ikili mesajlar base64 olarak alınır.
HandShakeCustomURL: socket.io oturumunu almak için URL'nin özelleştirilmesine olanak tanır.
HandShakeTimestamp: yalnızca yeni bir oturum istendiğinde zaman damgasını bir parametre olarak göndermek istiyorsanız etkinleştirin (bir gevent-socketio python sunucusuna erişmeye çalışıyorsanız bu özelliği etkinleştirin).
HandShakeAuthToken: sunucu kimlik doğrulama için bir token gerektiriyorsa, kimlik doğrulama token'ını buraya ayarlayın.
Namespace: sunucuya bağlanırken bir ad alanı ayarlamaya olanak tanır.
Polling: bu özellik devre dışı bırakıldığında, istemci aktarım olarak websocket kullanarak doğrudan sunucuya bağlanır.
Parameters: bağlantı parametrelerini ayarlamanıza olanak tanır.
EncodeParameters: etkinleştirilirse, parametreler kodlanır.
socket.io sunucusuna mesaj göndermek için WriteData yöntemini kullanın (Message Types bölümünü izleyerek).
1. Kullanıcı adı olarak John kullanarak bir parametre ile "add user" yöntemini çağırın.
WriteData('42["add user", "John"]');
Yeni bir websocket bağlantısı kurulmadan önce, socket.io sunucusu istemcinin yeni bir oturum id'si almak için yeni bir HTTP bağlantısı açmasını gerektirir. Bazı durumlarda, socket.io sunucusu HTTP header'ları kullanarak kimlik doğrulama gerektirir. Basic authorization veya Bearer token kimlik doğrulaması gibi özel HTTP header'ları eklemek için bu olayı kullanabilirsiniz.
Bu olay, socket.io bağlantısı başarılı olduktan ve istemci sunucuya mesaj gönderebildikten sonra çağrılır. Burada, örneğin namespace'lere abone olabilirsiniz.
Bir WebSocket sunucusu güvenli bağlantılar gerektirdiğinde, bir istemci sunucuya bağlanmaya çalıştığında şuna benzer bir hata mesajı alabilirsiniz:
SSL ile bağlanırken hata. error:XXXXXXXX:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
Bu hata, istemcinizin sunucu tarafından desteklenmeyen bir TLS sürümünü kullanarak bağlanmaya çalıştığı anlamına gelir.
Bu hatayı çözmek için WebSocket istemci bileşeninin OnSSLAfterCreateHandler olayını işlemeli ve daha yeni bir TLS sürümü ayarlamalısınız.
Örneğin: burada protokol sürümü olarak TLS 1.2 ayarlıyoruz.
procedure TfrmWebSocketClient.SOCKETIOHTTPConnectionSSL(Sender: TObject;
aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
TIdSSLIOHandlerSocketOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;