客户端client 突然断电了,那么服务器如何快速的知道呢

(1)使用定时器(适合有数据流动的情况)。
(2)使用socket选项SO_KEEPALIVE(适合没有数据流动的情况)。

        心跳包技术:心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。

心跳包的发送,通常有两种技术:

       

方法1:应用层自己实现的心跳包。   

        由应用程序自己发送心跳包来检测连接是否正常。
        大致的方法是:服务器端在一个 定时事件中 定时向客户端发送一个短小的数据包,然后启动一个线程,在该线程当中不断检测客户端的ACK应答包。如果在定时时间内收到了客户端的ACK应答包,说明客户端与服务器端的TCP连接仍然是可用的。但是,如果定时器已经超时、而服务器仍然没有收到客户端的ACK应答包,即可以认为客户端已经断开。同样道理,如果客户端在一定时间内没有收到服务器的心跳包,则也会认为改TCP连接不可用了。

       注释:原作者理解有误,心跳包应该由客户端在一个定时事件中定时向客户端发送一个短小的数据包,如果服务端收到客户端的心跳包或正常报文,则服务端的计数器归零;服务端启动一个定时器定时累加计数器,当计数器的累加值超过一定值时,则认为客户端断开。

方法2:TCP协议的KeepAlive保活机制。   

        因为要考虑到一个服务器通常会连接很多个客户端,因此,由用户在应用层自己实现心跳包,代码较多而且稍显复杂。
而利用TCP/IP协议层的内置的KeepAlive功能来实现心跳功能则简单得多。不论是服务器端还是客户端,只要一端开启KeepAlive功能后,就会自动的在规定时间内向对端发送心跳包, 而另一端在收到心跳包后就会自动回复,以告诉对端主机我仍然在线。
        因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认是不开启KeepAlive功能的。尽管这微不足道,但是在按流量计费的环境下增加了费用,另一方面,KeepAlive设置不合理的话有可能会 因为短暂的网络波动而断开健康的TCP连接。并且,默认的KeepAlive超时需要即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长。因此,我们需要手工开启KeepAlive功能并设置合理的KeepAlive参数。

 

————————————————

版权声明:本文为CSDN博主「会飞的猪宝宝啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/swty3356667/article/details/84332472

https://blog.csdn.net/swty3356667/article/details/84332472?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,可以使用OPC库来实现OPC客户端与OPC服务器之间的通信。以下是使用OPC库实现远程访问OPC服务器的步骤: 1. 安装OPC库:可以从NI官网下载并安装NI OPC Servers和NI OPC Client等相关组件。 2. 引用OPC库:在Visual Studio中,可以通过NuGet包管理器安装OPC库,并将其添加到项目的引用中。 3. 创建OPC客户端对象:可以使用OPC库提供的OpcClient类创建OPC客户端对象。 4. 连接OPC服务器:使用OPC客户端对象的Connect方法连接OPC服务器,需要指定OPC服务器的IP地址和名称。 5. 浏览OPC服务器:使用OPC客户端对象的Browse方法浏览OPC服务器中的节点和标签。 6. 读取OPC服务器数据:使用OPC客户端对象的Read方法读取OPC服务器中的数据。 7. 写入OPC服务器数据:使用OPC客户端对象的Write方法写入数据到OPC服务器。 下面是一个简单的示例代码: ``` using Opc; using Opc.Da; // 创建OPC客户端对象 OpcClient client = new OpcClient(); // 连接OPC服务器 client.Connect("opc.tcp://localhost:4840", new Opc.ConnectData(new System.Net.NetworkCredential())); // 浏览OPC服务器 BrowseElement[] elements = client.Browse(new ItemIdentifier[] { new ItemIdentifier("Root") }); // 读取OPC服务器数据 ItemValueResult[] results = client.Read(new Item[] { new Item(new ItemIdentifier("Random.Int1"), true, "") }); // 写入OPC服务器数据 client.Write(new Item[] { new Item(new ItemIdentifier("Random.Int1"), 123) }); // 断开OPC服务器连接 client.Disconnect(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值