সিগন্যালআর কনসোল অ্যাপ্লিকেশন উদাহরণ


85

। নেট হাবটিতে কোনও বার্তা প্রেরণে সিগন্যালআর ব্যবহার করে কোন কনসোল বা উইনফর্ম অ্যাপটির কোনও ছোট উদাহরণ রয়েছে? আমি। নেট উদাহরণগুলি চেষ্টা করে দেখেছি এবং উইকির দিকে নজর রেখেছি তবে এটি আমার কাছে হাব (। নেট) এবং ক্লায়েন্টের (কনসোল অ্যাপ) মধ্যে সম্পর্ক (এর উদাহরণ খুঁজে পাচ্ছে না) sense অ্যাপ্লিকেশনটির কি সংযোগের জন্য কেবল হাবের ঠিকানা এবং নাম প্রয়োজন ?.

যদি কেউ কোনও হাবের সাথে সংযোগ স্থাপন করে এবং "হ্যালো ওয়ার্ল্ড" বা। নেট হাবটি গ্রহণ করে এমন কিছু প্রেরণ করে কোডের একটি ছোট্ট কোড সরবরাহ করতে পারে।

পুনশ্চ. আমার কাছে একটি স্ট্যান্ডার্ড হাব চ্যাটের উদাহরণ রয়েছে যা ভাল কাজ করে, আমি যদি সিএস-তে একটি হাব নাম দেওয়ার চেষ্টা করি তবে এটি কাজ করা বন্ধ করে দেয় [[হাবনাম ("পরীক্ষা")]], এর কারণ কি জানেন??

ধন্যবাদ

বর্তমান কনসোল অ্যাপ কোড।

static void Main(string[] args)
{
    //Set connection
    var connection = new HubConnection("http://localhost:41627/");
    //Make proxy to hub based on hub name on server
    var myHub = connection.CreateProxy("chat");
    //Start connection
    connection.Start().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Connected");
        }
    }).Wait();

    //connection.StateChanged += connection_StateChanged;

    myHub.Invoke("Send", "HELLO World ").ContinueWith(task => {
        if(task.IsFaulted)
        {
            Console.WriteLine("There was an error calling send: {0}",task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Send Complete.");
        }
    });
 }

হাব সার্ভার (বিভিন্ন প্রকল্প কর্মক্ষেত্র)

public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.addMessage(message);
    }
}

এর জন্য উইকি তথ্য হ'ল http://www.asp.net/signalr/overview/signalr20/hubs-api/hubs-api-guide-net-client


ঠিক আছে আসলে এটি ঠিক কাজ করেছিল ভেবেছিল আমি একই ফলাফল পাচ্ছি মাত্র কিছু স্টপ পয়েন্ট এবং কনসোল.ড্রিনডাইন (); শেষে. হুফ!
ব্যবহারকারী 685590

উত্তর:


111

প্রথমত, আপনাকে সার্ভার অ্যাপ্লিকেশনটিতে সিগন্যালআর.হোস্ট.সেল্ফ এবং নুগেট দ্বারা আপনার ক্লায়েন্ট অ্যাপ্লিকেশনটিতে সিগন্যালআর.ক্লায়েন্ট ইনস্টল করা উচিত:

প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ সিগন্যাল.হোস্টিং.সুলভ-সংস্করণ 0.5.2

প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেট.সাইনালআর.ক্লায়েন্ট

তারপরে আপনার প্রকল্পগুলিতে নিম্নলিখিত কোড যুক্ত করুন;)

(প্রশাসক হিসাবে প্রকল্পগুলি পরিচালনা করুন)

সার্ভার কনসোল অ্যাপ:

using System;
using SignalR.Hubs;

namespace SignalR.Hosting.Self.Samples {
    class Program {
        static void Main(string[] args) {
            string url = "http://127.0.0.1:8088/";
            var server = new Server(url);

            // Map the default hub url (/signalr)
            server.MapHubs();

            // Start the server
            server.Start();

            Console.WriteLine("Server running on {0}", url);

            // Keep going until somebody hits 'x'
            while (true) {
                ConsoleKeyInfo ki = Console.ReadKey(true);
                if (ki.Key == ConsoleKey.X) {
                    break;
                }
            }
        }

        [HubName("CustomHub")]
        public class MyHub : Hub {
            public string Send(string message) {
                return message;
            }

            public void DoSomething(string param) {
                Clients.addMessage(param);
            }
        }
    }
}

ক্লায়েন্ট কনসোল অ্যাপ্লিকেশন:

using System;
using SignalR.Client.Hubs;

namespace SignalRConsoleApp {
    internal class Program {
        private static void Main(string[] args) {
            //Set connection
            var connection = new HubConnection("http://127.0.0.1:8088/");
            //Make proxy to hub based on hub name on server
            var myHub = connection.CreateHubProxy("CustomHub");
            //Start connection

            connection.Start().ContinueWith(task => {
                if (task.IsFaulted) {
                    Console.WriteLine("There was an error opening the connection:{0}",
                                      task.Exception.GetBaseException());
                } else {
                    Console.WriteLine("Connected");
                }

            }).Wait();

            myHub.Invoke<string>("Send", "HELLO World ").ContinueWith(task => {
                if (task.IsFaulted) {
                    Console.WriteLine("There was an error calling send: {0}",
                                      task.Exception.GetBaseException());
                } else {
                    Console.WriteLine(task.Result);
                }
            });

            myHub.On<string>("addMessage", param => {
                Console.WriteLine(param);
            });

            myHub.Invoke<string>("DoSomething", "I'm doing something!!!").Wait();


            Console.Read();
            connection.Stop();
        }
    }
}

আপনি উইন্ডোজ অ্যাপ্লিকেশনটিতে উপরের কোডটি ব্যবহার করতে পারেন তবে এটি কি সত্যই প্রয়োজনীয় ?! আপনি কী বলতে চাইছেন তা নিশ্চিত নই, আপনি অন্য উপায়ে উইন্ডোতে অবহিত করতে পারেন।
মেহরদাদ বাহরাইন

4
ক্লায়েন্ট সার্ভারের সাথে 1.0.0-alpha2 পর্যন্ত সার্ভারের সাথে কাজ করে যেমন ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেট.সাইনালআর.ক্লায়েন্ট- রূপান্তর 1.0.0- alpha2 nuget.org/packages/Mic Microsoft.AspNet.SignalR.Client/1.0.0- alpha2 (কোড এবং সিগন্যালআর সংস্করণগুলিতে VS2010 এসপি 1 ব্যবহার করে। নেট 4.0 এর সাথে কাজ করা উচিত) কেন আমি এটি কাজ করতে পারছি না তা চেষ্টা করার চেষ্টা করা হচ্ছে, শেষ পর্যন্ত সিগন্যালআর সংস্করণগুলির সাথে ক্লায়েন্টটি চেষ্টা করে।
নিক গাইলস

সুন্দর, সত্যিই সহায়ক
ডিকা আরতা করুনিয়া

4
নোট করুন .On<T>()পদ্ধতিটি কল করার আগে আপনাকে অবশ্যই ইভেন্ট শ্রোতাদের ( পদ্ধতি কলগুলি) যুক্ত করতে হবে connection.Start()
নিকোলোকোডেভ

এটি এই লিঙ্কটি সরবরাহ করার দাবিদার: ডকস.মাইক্রোসফট.হেন
মোহাম্মদ নূরল্ডিন

24

সিগন্যালআর 2.2.1 (মে 2017) এর উদাহরণ

সার্ভার

ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেট.সিগনালআর.সেল্হহস্ট-সংস্করণ ২.২.১

[assembly: OwinStartup(typeof(Program.Startup))]
namespace ConsoleApplication116_SignalRServer
{
    class Program
    {
        static IDisposable SignalR;

        static void Main(string[] args)
        {
            string url = "http://127.0.0.1:8088";
            SignalR = WebApp.Start(url);

            Console.ReadKey();
        }

        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseCors(CorsOptions.AllowAll);

                /*  CAMEL CASE & JSON DATE FORMATTING
                 use SignalRContractResolver from
                /programming/30005575/signalr-use-camel-case

                var settings = new JsonSerializerSettings()
                {
                    DateFormatHandling = DateFormatHandling.IsoDateFormat,
                    DateTimeZoneHandling = DateTimeZoneHandling.Utc
                };

                settings.ContractResolver = new SignalRContractResolver();
                var serializer = JsonSerializer.Create(settings);
                  
               GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),  () => serializer);                
            
                 */

                app.MapSignalR();
            }
        }

        [HubName("MyHub")]
        public class MyHub : Hub
        {
            public void Send(string name, string message)
            {
                Clients.All.addMessage(name, message);
            }
        }
    }
}

ক্লায়েন্ট

(মেহেরদাদ বাহরাইনের জবাবের মতো প্রায়)

ইনস্টল-প্যাকেজ মাইক্রোসফ্ট.এএসপনেট.সাইনালআর.ক্লায়েন্ট-সংস্করণ ২.২.১

namespace ConsoleApplication116_SignalRClient
{
    class Program
    {
        private static void Main(string[] args)
        {
            var connection = new HubConnection("http://127.0.0.1:8088/");
            var myHub = connection.CreateHubProxy("MyHub");

            Console.WriteLine("Enter your name");    
            string name = Console.ReadLine();

            connection.Start().ContinueWith(task => {
                if (task.IsFaulted)
                {
                    Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine("Connected");

                    myHub.On<string, string>("addMessage", (s1, s2) => {
                        Console.WriteLine(s1 + ": " + s2);
                    });

                    while (true)
                    {
                        Console.WriteLine("Please Enter Message");
                        string message = Console.ReadLine();

                        if (string.IsNullOrEmpty(message))
                        {
                            break;
                        }

                        myHub.Invoke<string>("Send", name, message).ContinueWith(task1 => {
                            if (task1.IsFaulted)
                            {
                                Console.WriteLine("There was an error calling send: {0}", task1.Exception.GetBaseException());
                            }
                            else
                            {
                                Console.WriteLine(task1.Result);
                            }
                        });
                    }
                }

            }).Wait();

            Console.Read();
            connection.Stop();
        }
    }
}

4
আমার জন্য কাজ করে না ... ওয়েবঅ্যাপ.স্টার্ট ()
এফ

কোনও সুযোগের দ্বারা, আপনি এখন কীভাবে এই স্ব-হোস্টেড সিগন্যাল সার্ভারে বিশ্বব্যাপী জসন সিরিয়ালাইজেশন সেটিংস (যেমন উটকেস) সেট করবেন?
Xaris Fytrakis

4
সুপার সহজ @XarisFytrakis, Ive anwser আপডেট, আপনি এখান থেকে চুক্তি সমাধানকারী প্রয়োজন: stackoverflow.com/questions/30005575/signalr-use-camel-case , সেইসাথে DateFormatHandling = DateFormatHandling.IsoDateFormat যদি আপনি এটি JS থেকে ব্যবহার করা হবে।
এডোকনেকশন

@ এডোকনেকশন দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ। নেট নেট ক্লায়েন্টের কাছ থেকে পদ্ধতি কল করার সময় এখন সমস্যা। উদাহরণস্বরূপ যদি আমি হাব ক্লাসে থাকি তবে এটিকে কল করুন: হাবকন্টেক্সট.স্লায়েন্টস.আল.উপেটেট মেট্রিক (নতুন {ডেটা = "এক্সএক্সএক্সএক্সএক্স", সামথিং = "ইয়াই" username, ব্যবহারকারীর নাম); আমি সঠিক সিরিয়ালাইজেশন সেটিংস (উট কেসড) এর সাথে জেসন প্রতিক্রিয়া পেয়েছি। তবে আমি যদি এটির মতো কোনও ক্লায়েন্টের (এসপ নেট ক্লায়েন্ট) পাস করা ডেটা দিয়ে কল করি: পাবলিক শূন্য আপডেট আপডেট মেট্রিক (অবজেক্ট মেট্রিক্স, স্ট্রিং এর ব্যবহারকারীর নাম) ub হুবকন্টেক্সট.ক্লায়েন্টস.এল.উপডেটমেট্রিক (ম্যাট্রিক্স, ব্যবহারকারীর নাম); ক্লায়েন্টের উপর ফলাফল উট কেসড হয় না।
Xaris Fytrakis


3

এটি ডট নেট কোর ২.১ এর জন্য - অনেকগুলি পরীক্ষার এবং ত্রুটির পরে অবশেষে আমি নির্দোষভাবে এটির কাজ করতে পেরেছি:

var url = "Hub URL goes here";

var connection = new HubConnectionBuilder()
    .WithUrl($"{url}")
    .WithAutomaticReconnect() //I don't think this is totally required, but can't hurt either
    .Build();

//Start the connection
var t = connection.StartAsync();

//Wait for the connection to complete
t.Wait();

//Make your call - but in this case don't wait for a response 
//if your goal is to set it and forget it
await connection.InvokeAsync("SendMessage", "User-Server", "Message from the server");

এই কোডটি আপনার সাধারণ সিগন্যালআর দরিদ্র ব্যক্তির চ্যাট ক্লায়েন্টের। আমি এবং অন্যান্য অনেক লোকের মধ্যে যে সমস্যাটি দেখা দিয়েছে তা হাবটিতে একটি বার্তা প্রেরণের চেষ্টা করার আগে একটি সংযোগ স্থাপন করা। এটি সমালোচনামূলক, সুতরাং অ্যাসিনক্রোনাস টাস্কটি সম্পন্ন হওয়ার জন্য অপেক্ষা করা গুরুত্বপূর্ণ - যার অর্থ আমরা টাস্কটি সম্পন্ন হওয়ার জন্য অপেক্ষা করে একে সংহত করে তুলছি।



1

ডটনেট কোরের জন্য @ ডাইলেক্সিকানাবাবোকের উত্তর তৈরি করতে, এখানে একটি ক্লায়েন্ট কনসোল অ্যাপ্লিকেশন:

একটি সহায়ক শ্রেণি তৈরি করুন:

using System;
using Microsoft.AspNetCore.SignalR.Client;

namespace com.stackoverflow.SignalRClientConsoleApp
{
    public class SignalRConnection
    {
        public async void Start()
        {
            var url = "http://signalr-server-url/hubname";

            var connection = new HubConnectionBuilder()
                .WithUrl(url)
                .WithAutomaticReconnect()
                .Build();

            // receive a message from the hub
            connection.On<string, string>("ReceiveMessage", (user, message) => OnReceiveMessage(user, message));

            var t = connection.StartAsync();

            t.Wait();

            // send a message to the hub
            await connection.InvokeAsync("SendMessage", "ConsoleApp", "Message from the console app");
        }

        private void OnReceiveMessage(string user, string message)
        {
            Console.WriteLine($"{user}: {message}");
        }

    }
}

তারপরে আপনার কনসোল অ্যাপের প্রবেশ বিন্দুতে প্রয়োগ করুন:

using System;

namespace com.stackoverflow.SignalRClientConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var signalRConnection = new SignalRConnection();
            signalRConnection.Start();

            Console.Read();
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.