Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others

Merhaba,

SignalR Hub sınıfları, client ile server arasında eşzamanlı etkileşimi kurabilmek ve server’a bağlı olan client’lar arasında isteğe özel farklı davranışlar sergileyebilmek için Caller, All ve Others özelliklerini içermektedir. Bu içeriğimizde, bu özelliklerin davranışlarını detaylarıyla inceleyecek ve ardından genel olarak kullanılan metotları değerlendireceğiz.

Client Türleri
Davranışa göre client türleri yukarıda da bahsedildiği gibi Caller, All ve Others olmak üzere üçe ayrılır;

Caller
Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
Sadece server’a bildirim gönderen client’la iletişim kurar.

    public class MyHub : Hub
    {
        public async Task SendCallerMessage(string message)
        {
            await Clients.Caller.SendAsync("receiveMessage", message);
        }
    }
All
Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
Server’a bağlı olan tüm client’lara bildiri gönderir.

    public class MyHub : Hub
    {
        public async Task SendAllMessage(string message)
        {
            await Clients.All.SendAsync("receiveMessage", message);
        }
    }
Others
Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
Server’a bildirim gönderen client hariç diğer tüm client’lara bildirim gönderir.

    public class MyHub : Hub
    {
        public async Task SendOthersMessage(string message)
        {
            await Clients.Others.SendAsync("receiveMessage", message);
        }
    }

İlgili propertylerin davranışlarını sergilemek için aşağıdaki görselleri inceleyebilirsiniz…

Caller All Others
Asp.NET Core - SignalR Serisi #8 - Clients Türleri ve Kullanılan Metotlar - Caller | All | Others Asp.NET Core - SignalR Serisi #8 - Clients Türleri ve Kullanılan Metotlar - Caller | All | Others Asp.NET Core - SignalR Serisi #8 - Clients Türleri ve Kullanılan Metotlar - Caller | All | Others

İleti Gönderim Metodu(SendAsync)
İleti gönderim metodu yukarıdaki Caller, All ve Others özelliklerinden kullanılanın davranışlarına göre şekillenmekle birlikte sade ve sadece ‘SendAsync’den ibarettir.

SendAsync aşağıdaki varyasyonlar eşliğinde kullanılır;

  • await Clients.Caller.SendAsync("receiveMessage", message);
    Sadece ilgili Hub’a ileti gönderene ileti gönderir.
  • await Clients.All.SendAsync("receiveMessage", message);
    Hub’a bağlı tüm client’lara ileti gönderir.
  • await Clients.Others.SendAsync("receiveMessage", message);
    Hub’a ileti gönderen dışındaki tüm client’lara ileti gönderir.

Hub Clients Metotları
Hub üzerinden etkileşime geçilecek olan client’lar ile özelleştirilmiş davranışlar sergileyebilmek için kullanılan metotlardır.

  • AllExcept
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
    Belirtilen client’lar hariç server’a bağlı tüm client’lara bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task AllExceptSendMessage(string[] excludedClients, string message)
            {
                await Clients.AllExcept(excludedClients).SendAsync("receiveMessage", message);
            }
        }
    
  • Client
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
    Server’a bağlı olan client’lar arasından sadece belirli bir client’a bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task ClientSendMessage(string connectionId, string message)
            {
                await Clients.Client(connectionId).SendAsync("receiveMessage", message);
            }
        }
    
  • Clients
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | OthersServer’a bağlı olan client’lar arasından sadece belirtilenlere bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task ClientsSendMessage(string[] clients, string message)
            {
                await Clients.Clients(clients).SendAsync("receiveMessage", message);
            }
        }
    
  • Group
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | OthersBelirtilen gruptaki tüm client’lara bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task AddToGroup(string groupName)
            {
                await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
            }
            public async Task GroupSendMessage(string groupName, string message)
            {
                await Clients.Group(groupName).SendAsync("receiveMessage", message);
            }
        }
    
  • GroupExcept
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | OthersBelirtilen grupta, belirtilen client’lar dışındaki tüm client’lara bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task AddToGroup(string groupName)
            {
                await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
            }
            public async Task GroupExceptSendMessage(string groupName, string[] excludedClients, string message)
            {
                await Clients.GroupExcept(groupName, excludedClients).SendAsync("receiveMessage", message);
            }
        }
    

    Not: Tüm metotlara dair UI ve Server olmak üzere ikili örneklendirmeleri makalenin en sonundaki örnek proje(leri) indirerek inceleyebilirsiniz. Bunlardan en kapsamlısı GroupExcept için yapılan örneklendirmedir. Özellikle incelemenizi tavsiye ederim.

  • Groups
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | OthersBirden çok gruptaki client’lara bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task GroupsSendMessage(string[] groupNames, string message)
            {
                await Clients.Groups(groupNames).SendAsync("receiveMessage", message);
            }
            public async Task GetGroupsClients(string[] groupsName)
            {
                List<string> datas = new List<string>();
                foreach (var groupName in groupsName)
                {
                    datas.AddRange(groupClients.Where(g => g.GroupName == groupName).Select(c => c.ConnectionId).ToList());
                }
                await Clients.Caller.SendAsync("getGroupClients", datas);
            }
        }
    
  • OthersInGroup
    Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | OthersBildiride bulunan client haricinde gruptaki tüm client’lara bildiride bulunur.

        public class MyHub : Hub
        {
            public async Task OthersInGroupSendMessage(string groupName, string message)
            {
                await Clients.OthersInGroup(groupName).SendAsync("receiveMessage", message);
            }
        }
    
  • User
    Authentication olan kullanıcıyla ilişkili tüm client’lara bildiride bulunur.
  • Users
    Authentication olan kullanıcılarla ilişkili tüm client’lara bildiride bulunur.

‘User’ ve ‘Users’ metotlarını ileride SignalR ile Authentication ve Authorization konularını ele alırken inceleyeceğiz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımızda görüşmek üzere…
İyi çalışmalar…

Not: Örnek projeleri indirmek için aşağıdaki linklere tıklayınız.

Bunlar da hoşunuza gidebilir...

15 Cevaplar

  1. Cenk dedi ki:

    User component ile admin componentlerim ayrı. Groups kullanıyorum. Userın yazdığı mesajı admin sayfasına nasıl bildirebilirim hocam? live support tarzı uygulama yapmaya çalışıyorum

  2. Can dedi ki:

    Hocam merhaba all olunca herkese mesaj gönderiyor ama Client yapıp user parametresini verince istediğim user a göndermeyi başaramadım. Kullanıcı kişi alıcının id sini girince veritabanından o id ye sahip olan kişi kimse onun ekranına mesajın ulaşmasını istiyorum nasıl yapabilirim. Kodları aşağıda belirtiyorum. Teşşekür ederim hocam.

    Js Kodları

    "use strict";
    
    var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build();
    
    //Disable send button until connection is established
    document.getElementById("sendButton").disabled = true;
    
    connection.start().then(function () {
        document.getElementById("sendButton").disabled = false;
    }).catch(function (err) {
        return console.error(err.toString());
    });
    
    document.getElementById("sendButton").addEventListener("click", function (event) {
        var user = document.getElementById("userInput").value;
        var message = document.getElementById("messageInput").value;
        connection.invoke("SendMessage", user, message).catch(function (err) {
            return console.error(err.toString());
        });
        event.preventDefault();
    });
    connection.on("ReceiveMessage", function (user, message) {
        var msg = message.replace(/&amp;/g, "&amp;").replace(//g, "&gt;");
        var encodedMsg = user + ":" + msg;
        var li = document.createElement("li");
        li.textContent = encodedMsg;
        document.getElementById("messagesList").appendChild(li);
    });
    

    Html Kodları

                &nbsp;
                    Alıcı Id
                    Message
                &nbsp;
    

    Hub Sınıfı Kodları

    using MentorShip.Models;
    using Microsoft.AspNetCore.SignalR;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    using System.Threading.Tasks;
    
    namespace MentorShip.Hubs
    {
        public class SignalRChat:Hub
        {
            Context c = new Context();
            public async Task SendMessage(string user, string message)
            {
                
                await Clients.Client(user).SendAsync("ReceiveMessage",message);
            }
        }
    }
    
  3. Mükremin dedi ki:

    Gencay Hocam verdiğiniz örnek proje linklerini indirdiğimizde içlerinde sln dosyası mevcut değil yani mesela MyHub adında oluşturduğunuz class ların cs dosyalarını bulamadım bende mi sıkıntı var yoksa mevcut değil mi?

  4. Can dedi ki:

    Hocam buradaki ConnectionId her refresh olduğunda yada kodu her çalıştırdığımızda değişiyor bunu her kullanıcı için değişmeyecek şekilde sabit connection id nasıl yapabiliriz?

    • Gençay dedi ki:

      Yapamazsın 🙂 Her bağlantıda yeni connection id atanır.

      • Can dedi ki:

        Anladım hocam peki belirli bir kullanıcıya mesaj gönderirken nasıl yapacağız mesela veritabanına kayıtlı bir başka kullanıcıya mesaj göndermek istersek nasıl bir yol izlemeliyiz ?

        • Gençay dedi ki:

          Bu sorunun cevabı bu makalede var Can. Dikkat edersen Client bu işlemi yapmaktadır.

          • Can dedi ki:

            Evet hocam biliyorum Client o işlemi gerçekleştiriyor ama connection id her seferinde değişiyor mesela ben size mesaj göndermek istediğim zaman her seferinde connection id değişiyor size mesaj göndereceğim zaman sürekli değişen id yi girmek yerine her seferinde sadece eposta adresinizi girsem o şekilde mesajı size iletme imkanım yok mu?

          • Gençay dedi ki:

            Client Hub’a bağlandığı zaman kendisini tanımlayan farklı özellikleri olmalıdır. Örneğin; ‘Can’ isimli client ‘123321’ connection id ile hub’a subscribe oldu. Bu esnada; ‘Can’ isimli ‘123321’ connection id’li client hub’a bağlandı şeklinde diğer client’lar bilgilendirilmelidir. Dolayısıyla, ‘Gençay’ client’ı ‘Can’ client’ına mesaj gönderecekse, kullanıcı ‘Can’ olduğunu bilecek ama yazılım onun connection id’si olan ‘123321’ değerini elde edip ona göre gerekli datayı gönderecektir. Bu şekilde çalışman gerekmektedir.

            Dikkat : Can burada bir property(ClientName, Email vs.) değeri olabilir.

  5. Can dedi ki:

    Şimdi anladım hocam çok teşekkür ederim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*