सिग्नलआर कंसोल ऐप उदाहरण


84

एक .net हब के लिए एक संदेश भेजने के लिए सिग्नलआर का उपयोग करते हुए एक सांत्वना या winform ऐप का एक छोटा सा उदाहरण है।? मैंने .net उदाहरणों की कोशिश की है और विकी पर नज़र डाली है, लेकिन यह मेरे लिए हब (.net) और क्लाइंट (कंसोल ऐप) के बीच के रिश्ते (इस का एक उदाहरण नहीं मिल सका) से कोई मतलब नहीं है। क्या एप्लिकेशन को कनेक्ट करने के लिए बस पते और हब का नाम चाहिए?

यदि कोई एप्लिकेशन को हब से कनेक्ट करने वाला एप्लिकेशन दिखा रहा हो और "Hello World" या कुछ और जो कि .net हब प्राप्त करता है, को भेज सकता है।

पुनश्च। मेरे पास एक मानक हब चैट उदाहरण है जो अच्छी तरह से काम करता है, अगर मैं इसे Cs में हब नाम निर्दिष्ट करने का प्रयास करता हूं, तो यह काम करना बंद कर देता है अर्थात [हबनाम ("परीक्षण")], क्या आप इसका कारण जानते हैं?

धन्यवाद।

वर्तमान कंसोल ऐप कोड।

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/signalr-20/hubs-api/hubs-api-guide-net-client है


ठीक है वास्तव में यह वास्तव में काम करता है मैंने सोचा था कि मैं एक ही परिणाम प्राप्त कर रहा था बस कुछ स्टॉप पॉइंट और कंसोल जोड़े गए। रीडलाइन (); अतं मै। Whoop !.
user685590

जवाबों:


111

सबसे पहले, आपको nuget द्वारा अपने क्लाइंट एप्लिकेशन पर सर्वर एप्लिकेशन और SignalR.Client पर SignalR.Host.Self स्थापित करना चाहिए:

पीएम> इंस्टाल-पैकेज सिग्नलआर.हॉस्टिंग.फ्लो -वर्जन 0.5.2

PM> इंस्टॉल-पैकेज Microsoft.AspNet.SignalR.Client

फिर अपनी परियोजनाओं में निम्नलिखित कोड जोड़ें;)

(प्रशासक के रूप में परियोजनाओं को चलाएं)

सर्वर कंसोल ऐप:

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();
        }
    }
}

आप विंडोज़ एप्लिकेशन में उपरोक्त कोड का उपयोग कर सकते हैं लेकिन क्या यह वास्तव में आवश्यक है ?! मुझे यकीन नहीं है कि आपका क्या मतलब है, आप अन्य तरीकों से खिड़कियों में सूचित कर सकते हैं।
मेहरदाद बहरीन

1
क्लाइंट सर्वर 0.5.2 के साथ काम करता तक 1.0.0-alpha2 जैसे स्थापित करें-पैकेज Microsoft.AspNet.SignalR.Client -संस्करण 1.0.0-alpha2 nuget.org/packages/Microsoft.AspNet.SignalR.Client/1.0.0-alpha2 (कोड और सिग्नलआर संस्करण .net 4.0 के साथ काम करना चाहिए। वीएस2010 SP1 का उपयोग करके) काम करने की कोशिश कर रहा है कि मैं इसे काम करने के लिए क्यों नहीं कर सका, आखिरकार सिग्नलआर के शुरुआती संस्करणों के साथ क्लाइंट की कोशिश की।
निक जाइल्स

अच्छा, वास्तव में उपयोगी
Dika Arta करुणिया

4
नोट: आपको .On<T>()कॉल करने से पहले ईवेंट श्रोताओं ( विधि कॉल) को जोड़ना होगा connection.Start()
निकोलोकोडेव

यह इस लिंक को प्रदान करने के लिए योग्य है: docs.microsoft.com/en-us/aspnet/signalr/overview/…
मोहम्मद नौरेल्डिन

24

सिग्नलआर 2.2.1 के लिए उदाहरण (मई 2017)

सर्वर

स्थापित करें-पैकेज Microsoft.AspNet.SignalR.SelfHost -Version 2.2.1

[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);
            }
        }
    }
}

ग्राहक

(मेहरदाद बहरीन जवाब के समान)

इंस्टॉल-पैकेज Microsoft.AspNet.SignalR.Client -Version 2.2.1

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
मेरे लिए काम नहीं करता है ... WebApp.Start ()
F ref A

मैं हब में संदेश कैसे देख सकता हूं? क्या ऐसा करना संभव है ?
कोब_24


@ Kob_24 वर्ग MyHub देखें, विधि भेजें - आप वहां संदेश देख सकते हैं।
डॉटनेट

2
@XarisFytrakis सुपर आसान, Ive awser को अपडेट करता है, आपको यहां से कॉन्ट्रैक्ट रिज़ॉल्वर चाहिए: stackoverflow.com/questions/30005575/signalr-use-camel-case साथ ही DateMormatHandling = DateFormatHandling.IsoDateFormat, अगर आप इसे js से उपभोग करते हैं।
11


2

यह डॉट नेट कोर 2.1 के लिए है - बहुत परीक्षण और त्रुटि के बाद मुझे अंततः यह निर्दोष रूप से काम करने के लिए मिला:

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");

यह कोड आपके विशिष्ट सिग्नलआर गरीब आदमी के चैट क्लाइंट से है। समस्या यह है कि मैं और जो बहुत से अन्य लोगों की तरह लगता है, वह एक संदेश स्थापित कर रहा है ताकि हब को संदेश भेजने का प्रयास किया जा सके। यह महत्वपूर्ण है, इसलिए अतुल्यकालिक कार्य को पूरा करने के लिए इंतजार करना महत्वपूर्ण है - जिसका अर्थ है कि हम कार्य को पूरा करने के लिए इंतजार करके इसे तुल्यकालिक बना रहे हैं।


आप वास्तव में शुरुआत को चेन कर सकते हैं और कनेक्शन के रूप में प्रतीक्षा कर सकते हैं
।tartAsync.Wait
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.