25.04.2024 tarihinde yayınlandı
2 dakikalık okuma
İnternet üzerinde gerçek zamanlı iletişim giderek daha önemli hale gelmektedir. Web uygulamaları, kullanıcılar arasında hızlı ve etkileşimli iletişim sağlamak için teknolojik olarak gelişmektedir. Bu ihtiyaca cevap veren birçok çözüm bulunmaktadır ve SignalR, bu çözümlerden biridir.
SignalR, Microsoft tarafından geliştirilen bir kütüphanedir ve gerçek zamanlı web uygulamaları oluşturmayı kolaylaştırır. İstemci ve sunucu arasında iki yönlü iletişimi destekler. Bu, sunucudaki değişikliklerin anında istemcilere iletilmesini ve istemcilerden sunucuya geri bildirim alınmasını sağlar. Özellikle sohbet uygulamaları, canlı puan tabloları, anlık bildirimler gibi gerçek zamanlı etkileşim gerektiren uygulamalarda yaygın olarak kullanılır.
SignalR, WebSocket, Server-Sent Events (SSE), Long Polling gibi farklı iletişim mekanizmalarını kullanarak gerçek zamanlı iletişim sağlar. Bunların arasında en etkin olanı WebSocket'tir çünkü tam çift yönlü iletişim sağlar. Ancak, WebSocket'in desteklenmediği ortamlarda SignalR diğer yöntemlere de otomatik olarak uyum sağlar.
Hub'lar (Hubs): SignalR, bir veya daha fazla hub sınıfı aracılığıyla iletişimi yönetir. Hub'lar, sunucuda gerçekleşen olayları dinler ve istemcilere bildirir. Aynı zamanda istemcilerden gelen talepleri alır ve bunları sunucu tarafında işler. Hub sınıfları, sunucu ve istemci arasındaki iletişimde aracı olarak görev yapar.
İstemci ve Sunucu: SignalR, istemci ve sunucu arasında iletişimi kurar. İstemci tarafında JavaScript API'si kullanılarak sunucuyla bağlantı kurulur ve sunucudaki hub'larla etkileşim sağlanır. Sunucu tarafında ise .NET veya .NET Core ortamında hub sınıfları tanımlanır ve istemcilerle iletişim gerçekleştirilir.
İletişim Protokolleri: SignalR, iletişimde WebSocket, Server-Sent Events, Long Polling gibi farklı protokolleri kullanabilir. Sunucu ve istemci arasında en etkin iletişim protokolü WebSocket'tir ancak bu protokolün desteklenmediği durumlarda diğer alternatif protokoller otomatik olarak devreye girer.
Avantajları
Gerçek Zamanlı İletişim: SignalR, sunucudaki değişikliklerin anında istemcilere iletilmesini sağlar, bu da gerçek zamanlı etkileşimli uygulamaların geliştirilmesini kolaylaştırır.
Çoklu Platform Desteği: SignalR, .NET ve .NET Core platformlarında kullanılabilir. Ayrıca istemciler için JavaScript API'si sağlar, bu da çeşitli istemci platformlarında (web tarayıcıları, mobil uygulamalar vb.) kullanılabilmesini sağlar.
Otomatik Protokol Seçimi: SignalR, desteklenen en etkin iletişim protokolünü otomatik olarak seçer. Bu sayede farklı platformlarda ve ortamlarda sorunsuz bir şekilde çalışabilir.
Kolay Kullanım: SignalR, basit bir API'ye sahiptir ve gerçek zamanlı iletişim sağlamak için gerekli olan alt yapıyı sağlar. Bu da geliştiricilerin uygulama geliştirmeye odaklanmalarını kolaylaştırır.
SignalR, gerçek zamanlı iletişim gerektiren web uygulamaları için güçlü bir çözümdür. Basit API yapısı ve otomatik protokol seçimi gibi özellikleriyle geliştiricilere kolaylık sağlar ve çeşitli platformlarda sorunsuz bir şekilde çalışabilir. Bu nedenle, gerçek zamanlı uygulamalar geliştiren geliştiriciler için önemli bir araçtır.
İlgili kütüphaneleri ekledikten sonra basit bir örnek için aşağıdaki kodlar kullanılabilir.
public interface IExampleTypeSafeHub
{
Task ReceiveMessageForAllClient(string message);
}
public class ExampleTypeSafeHub : Hub<IExampleTypeSafeHub>
{
public async Task BroadcastMessageToAllClient(string message)
{
await Clients.All.ReceiveMessageForAllClient(message);
}
}
Program.cs'de;
builder.Services.AddSignalR();
app.MapHub<ExampleTypeSafeHub>("/exampleTypeSafeHub");
Javascript tarafında;
$(document).ready(function () {
const connection = new signalR.HubConnectionBuilder().withUrl("/exampleTypeSafeHub").configureLogging(signalR.LogLevel.Information).build();
const broadcastMessageToAllClientHubMethodCall = "BroadcastMessageToAllClient";
const receiveMessageForAllClientClientMethodCall = "ReceiveMessageForAllClient";
async function start() {
try {
await connection.start().then(() => {
console.log("Hub connected");
$("#div-connection-id").html(`Connection Id : ${connection.connectionId}`);
});
} catch (e) {
setTimeout(() => start(), 5000);
}
}
connection.onclose(async () => {
await start();
})
start();
$("#btn-send-message-all-client").click(function () {
const message = "hello world";
connection.invoke(broadcastMessageToAllClientHubMethodCall, message).catch(err => console.error("error:", err));
});
connection.on(receiveMessageForAllClientClientMethodCall, (message) => {
console.log("Received message:", message);
});
});
Örnek projeyi github üzerinden inceleyebilirsiniz.
Daha fazla göster