• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#socket心跳重连

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
        /// <summary>
        /// 检查一个Socket是否可连接
        /// </summary>
        /// <param name="socket"></param>
        /// <returns></returns>
        private bool IsConnected(Socket socket)
        {
            if (socket == null || socket.Connected == false)
            {
                return false;
            }

            bool blockingState = socket.Blocking;
            try
            {
                byte[] tmp = new byte[1];
                socket.Blocking = false;
                socket.Send(tmp, 0, 0);
                return true;
            }
            catch (SocketException e)
            {
                // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
                if (e.NativeErrorCode.Equals(10035))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            finally
            {
                socket.Blocking = blockingState;    // 恢复状态
            }
        }

上面的代码来自互联网

原理就是在外面加个timer/task/thread,每隔一段时间,做心跳检查。如果发送信息失败表示无法连接,那么我们就可以重连了。

        /// <summary>
        /// 轮询检查Socket连接
        /// </summary>
        private void PollingCheckSocket()
        {
            _pollingCheckSocketTimer = new System.Threading.Timer((obj) =>
            {
                if (!_run)//控制timer暂停、恢复用的
                {
                    return;
                }

                foreach (var hub in _hubs)
                {
                    //为null或断开连接时,重连
                    var connected = this.IsConnected(hub.Socket);
                    if (!connected)
                    {
                        _socketService.Close(hub.Socket);
                        hub.Socket = _socketService.Get(hub);
                    }
                }
            }, null, 10000, 15000);//表示10秒后开始检查,然后每15秒检查一次
        }

我是将socket作为hub的一个属性。这里是遍历所有hub,逐一检查每个hub的socket是否断开。如果断开了,先关闭旧的socket,再重连。需要说明的是,这里的重连是新建一个socket连接,旧的socket连接是无法再次连接的。以下是socket辅助类:

    public class SocketService
    {
        private Logger _logger = LogManager.GetCurrentClassLogger();

        /// <summary>
        /// 获取socket
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Socket Get(HubModel model)
        {
            try
            {
                // 将IP地址字符串转换为IPAddress对象
                IPAddress ip = IPAddress.Parse(model.IP);
                // 创建终结点EndPoint
                IPEndPoint endPoint = new IPEndPoint(ip, model.Port);
                // 创建Socket并连接到服务器
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // 连接到服务器
                socket.Connect(endPoint);

                return socket;
            }
            catch (System.Exception ex)
            {
                _logger.Error(string.Format("获取socket异常,message:{0},stacktrace:{1}", ex.Message, ex.StackTrace));
            }
            return null;
        }

        /// <summary>
        /// 关闭socket
        /// </summary>
        /// <param name="socket"></param>
        public void Close(Socket socket)
        {
            if (socket != null)
            {
                socket.Close();
                socket = null;
            }
        }
    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap