【问题标题】:How to keep trying connection to websocket even when max retry count for connection has been reached ?即使已达到连接的最大重试次数,如何继续尝试连接到 websocket?
【发布时间】:2018-10-25 08:51:48
【问题描述】:

我目前使用的 C# 应用程序需要通过 websocket 连接到用 C++ 编码的软件。 C# 应用程序是客户端,C++ 软件是服务器。 如果未连接,我希望 C# 应用程序每 5 秒尝试重新连接到 websocket。我目前正在使用 websocket-sharp。

这是我目前的代码:

using System;
using System.Threading;
using WebSocketSharp;

namespace ConsoleApp1
{
    class Program
    {
         static void Main(string[] args)
         {
            using (var ws = new WebSocket("ws://192.168.1.25:50000"))
            {
                ws.OnMessage += (sender, e) =>
                {
                    Console.WriteLine("Message received : " + e.Data);
                    if (e.Data == "alreadyConnected")
                    {
                        ws.Send("forceConnect");
                    }
                    if (e.Data == "connexionEstablished")
                    {
                        ws.Send("Hello server");
                    }
                };

                ws.OnOpen += (sender, e) =>
                {
                    Console.WriteLine("Connexion has been established");
                    ws.Send("some message");
                };

                ws.OnClose += (sender, e) =>
                {
                    Console.WriteLine("Connexion has been lost");
                    if (!e.WasClean)
                    {
                        if (!ws.IsAlive)
                        {
                            Thread.Sleep(5000);
                            ws.Connect();
                        }
                    }
                };

                ws.OnError += (sender, e) =>
                {
                    Console.WriteLine("Connexion has led to an error");
                };

                ws.Connect();
                Console.ReadKey(true);
            }
        }
    }
}

但在 10 次尝试失败后,我收到一条错误消息“一系列重新连接失败”。这是由于 websocket-sharp 中固定的最大重试次数。收到此消息后,我找不到继续尝试重新连接的方法(也没有单独尝试,也没有在互联网上搜索)。有人知道我可以这样做吗?

如果有人可以提供帮助,我将非常感激 :) 祝你有美好的一天!

【问题讨论】:

    标签: c# websocket-sharp


    【解决方案1】:

    以下是我用来在主机和客户端之间的连接由于某种原因中断时不断尝试重新连接的一些高级代码。下面的 sn-p 本身未经测试,但我在生产代码中使用了类似的结构。

    另外一个要求是WebSocketSharp library,它包含使 Websocket 编码变得非常容易的所有元素。

    using System;
    using System.Text;
    using System.Net.Sockets;
    using System.Collections.Generic;
    
    using WebSocketSharp;
    
    
    
    namespace Application1
    {
        class Program
        {
    
    
            static void Main(string[] args)
            {
    
                // Locals
                string host         = "127.0.0.1";
                int port            = 8080;
                int Frq_Reconnect   = 10000;
                WebSocket ws;
    
                // Start WebSocket Client
                ws              = new WebSocket(string.Format("ws://{0}:{1}", host, port));
                ws.OnOpen       += new EventHandler(ws_OnOpen);
                ws.OnMessage    += new EventHandler<MessageEventArgs>(ws_OnMessage);
                ws.OnError      += new EventHandler<ErrorEventArgs>(ws_OnError);
                ws.OnClose      += new EventHandler<CloseEventArgs>(ws_OnClose);
    
    
                // Connection loop
                while (true)
                {
                    try
                    {
                        if (!ws.IsAlive)
                        {
                            ws.Connect();
                            if (ws.IsAlive)
                            {
                                ws.Send(JsonConvert.SerializeObject(json, Formatting.None));
                            }
                            else
                            {
                                Console.WriteLine(string.Format("Attempting to reconnect in {0} s", Frq_Reconnect / 1000));
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        string errMsg = e.Message.ToString();
                        if (errMsg.Equals("The current state of the connection is not Open."))
                        {// remote host does not exist
                            Console.WriteLine(string.Format("Failed to connect to {0}:{1}", host, port));
                        }
                        if (errMsg.Equals("A series of reconnecting has failed."))
                        {// refusal of ws object to reconnect; create new ws-object
    
                            ws.Close();
    
                            ws             = new WebSocket(string.Format("ws://{0}:{1}", host, port));
                            ws.OnOpen     += new EventHandler(ws_OnOpen);
                            ws.OnMessage  += new EventHandler<MessageEventArgs>(ws_OnMessage);
                            ws.OnError    += new EventHandler<ErrorEventArgs>(ws_OnError);
                            ws.OnClose    += new EventHandler<CloseEventArgs>(ws_OnClose);
    
                        }
                        else
                        {// any other exception
                            Console.WriteLine(e.ToString());
                        }
    
                    }
    
    
                // Callback handlers
                void ws_OnClose(object sender, CloseEventArgs e)
                {
                    Console.WriteLine("Closed for: " + e.Reason);
                }
    
                void ws_OnError(object sender, ErrorEventArgs e)
                {
                    Console.WriteLine("Errored");
                }
    
                void ws_OnMessage(object sender, MessageEventArgs e)
                {
                    Console.WriteLine("Messaged: " + e.Data);
                }
    
                void ws_OnOpen(object sender, EventArgs e)
                {
                    Console.WriteLine("Opened");
                }
    
    
    
            }// end      static void Main(...)
    
    
    
        }
    }
    

    这会捕获 WebSocket 对象超时异常,清理当前对象实例,然后创建一个新实例。随后整体连接循环继续进行。

    对我来说,以上内容让我尝试重新连接一整夜......

    此外,此代码的结构确保在长时间的连接重试时不会出现堆栈溢出。例如,我看到有人在 On_Close 事件处理程序中处理连接中止。这最终不起作用,因为这种方法会导致重新实例化 WebSocket 对象并最终导致系统资源耗尽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多