///

/// 检查一个Socket是否可连接

///

///

///

private bool IsConnected(Socket socket)

{

if (socket == null || socket.Connected == false)

{

return false;

}

bool blockingState = socket.Blocking;

try

{

byte[] tmp = new byte[];

socket.Blocking = false;

socket.Send(tmp, , );

return true;

}

catch (SocketException e)

{

// 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的

if (e.NativeErrorCode.Equals())

{

return true;

}

else

{

return false;

}

}

finally

{

socket.Blocking = blockingState; // 恢复状态

}

}

上面的代码来自互联网

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

///

/// 轮询检查Socket连接

///

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, , );//表示10秒后开始检查,然后每15秒检查一次

}

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

public class SocketService

{

private Logger _logger = LogManager.GetCurrentClassLogger();

///

/// 获取socket

///

///

///

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;

}

///

/// 关闭socket

///

///

public void Close(Socket socket)

{

if (socket != null)

{

socket.Close();

socket = null;

}

}

}

}

初探和实现websocket心跳重连

心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开, 而浏览器不会执行websocket 的 onclos ...

web socket 心跳包的实现方案

web socket 心跳包的实现方案05/30/2010 现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我 ...

初探和实现websocket心跳重连(npm: websocket-heartbeat-js)

提示:文章最下方有仓库地址 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒.因此为了保证连接的可持续性和稳定性,websocket ...

【简记】前端对接WebSocket与心跳重连

前言 最近又在忙着开发别的模块,其中包含了即时通讯这一块,上一次做即时通讯时还是去年年底,一时间代码都在自己的笔记本里,还没带--这里就记录一下前端对接WebSocket的实现,包含心跳重连,简记之. ...

websocket心跳重连 websocket-heartbeat-js

初探和实现websocket心跳重连(npm: websocket-heartbeat-js) 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间 ...

161114、websocket实现心跳重连

心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开, 而浏览器不会执行websocket 的 onclos ...

websocket 心跳重连

websocket 的基本使用: var ws = new WebSocket(url); ws.onclose = function () { //something reconnect(); // ...

[转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例

转载自:zxh2075的专栏 在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返 ...

socket心跳包机制实践与理解

实现Socket心跳包主要分为两大类,第一采用tcp自带的KeepAlive,第二是自定义心跳包,恰巧我在产品VICA中都使用过,下面就这两种心跳包机制谈谈个人的理解与感受. 首先第一种KeepAli ...

随机推荐

在excel worksheet中添加button 和对Excel workbook做权限控制相关的新知识

添加button在worksheet中 1. Shapes Object (Excel) Reference:http://technet.microsoft.com/zh-cn/library/ff ...

【zz】Matlab 二值图像形态学函数 bwmorph

C语言socket重连和心跳,c# socket 心跳 重连相关推荐

  1. Android Socket连接(模拟心跳包,断线重连,发送数据等)

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat 喻志强的博客 耐心 细心 用心 传播正能量 RSS订阅 原 A ...

  2. Socket网络编程tcp聊天案例(心跳包,多线程,断线重连机制)

    实现一个聊天的案例,使用多线程和心跳包.当服务器断开的时候,客户端会自动尝试重新连接,当服务器开启的时候,客户端会自动连接 Server服务器类 package Demo3_Chat;import c ...

  3. php 如何实现心跳包,Socket心跳机制-JS+PHP实现

    本文是我在实际工作中用到的Socket通信,关于心跳机制的维护方式,特意总结了一下,希望对朋友们有所帮助. Socket应用:首先Socket 封装了tcp协议的,通过长连接的方式来与服务器通信,是由 ...

  4. netty心跳过程中 发送消息失败_Netty 4.0 实现心跳检测和断线重连

    arg0.pipeline().addLast("ping", new IdleStateHandler(25, 15, 10,TimeUnit.SECONDS)); 这个处理器, ...

  5. netty心跳过程中 发送消息失败_netty心跳机制和断线重连(四)

    心跳是为了保证客户端和服务端的通信可用.因为各种原因客户端和服务端不能及时响应和接收信息.比如网络断开,停电 或者是客户端/服务端 高负载. 所以每隔一段时间 客户端发送心跳包到客户端  服务端做出心 ...

  6. Netty 心跳机制及断线重连

    1.心跳检测 心跳检测是在TCP长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制. 为什么使用心跳检测? 假死:如果底层的TCP连接(socket连接)已经断 ...

  7. Netty 4.0 实现心跳检测和断线重连

    一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端 一般情况下,客户端与服务端在指定时间内没有任何读写请求,就会认为连接是idle(空闲 ...

  8. 长连接 、短连接、心跳机制与断线重连

    在不同场景下要考虑长连接还是短连接,那么我们要先了解他. 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应,一次连接就完成了. 这时候双方任 ...

  9. 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, ...

最新文章

  1. svn mysql认证_svnapachemysql 认证搭建
  2. 【转】Usage of sendBroadcast()
  3. fiddler及postman讲解
  4. Jazz揭秘:下一代开发平台常见问题百科全说
  5. PyQt5 QTableView 全部item居中
  6. CVPR 2022 论文/代码分类汇总!持续更新中!
  7. [HNOI 2010]Planar
  8. 80386/386/Intel386 架构/流水线及其优化
  9. LTE物理传输资源(2)-频带、信道带宽和频点号EARFCN
  10. 计算机硬件 系统安装维护教程 04系统安装-Win-02:使用Dism++对系统进行初始化前配置
  11. 人机工程学产品设计案例_【设计案例】一组电子产品设计的合辑
  12. Nmap扫描机器开放的端口
  13. Ribbon界面开发
  14. ps盖印图层在哪里_PS如何盖印图层?PS盖印图层快捷键
  15. Flutter 竖线 垂直分割线
  16. 2013年最火和最挣钱的IT职位
  17. ArcGIS中加载各种在线地图
  18. 沟通表达的实用技巧和练习方法
  19. 四大主流新闻App竞品分析
  20. 【ESP 保姆级教程 预告】疯狂Node.js服务器篇 ——案例:ESP8266 + DS18B20温度传感器 +NodeJs本地服务+ MySQL数据库

热门文章

  1. OPA和Gatekeeper区别?
  2. android gatekeeper(locksetting密码锁)学习这一篇就够了
  3. 剑指Offer——腾讯+360+搜狗校招笔试题+知识点总结
  4. LoRa的码片速率chip rate
  5. Word文档中怎么删除空白页?删除空白页的五种方法
  6. 为什么有的公司会规定所有接口都用 POST请求?
  7. 确定某天是星期几的c语言程序,计算某天是星期几【C代码】
  8. bboss-elasticsearch--API
  9. Polkadot + DeFi | 透明公平、高效交易的去中心化金融未来可期
  10. 使用unity的mesh绘制三菱柱的碰撞体(3d三角形)