网络编程socket慎重断开连接

这篇具有很好参考价值的文章主要介绍了网络编程socket慎重断开连接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务场景

  • 我们公司是做智慧交通的,主要卖交通相关的硬件产品和软件平台
  • 硬件主要是路口或路段上的前端硬件设备,包括信号机、雷达、雷视、边缘计算单元等,软件包括信控平台、智慧路口、管控平台等
  • 信号机通信协议有国标推荐协议,定义了一些接口和数据字段,现在信号机厂商常用的有国标2007和国标2017,这也是信号机送检需要遵守的协议
  • 一般经过检验、进入市场的信号机,至少都已经实现了国标2007协议,当然,由于要创造通信壁垒,防止自家的信号机被别的信控平台轻松接入,各家对协议的细节都有不同的实现
  • 当然,这也是因为国标协议没有定义这些细节,因此统一信控很难实现,除非是不做信号机硬件只做平台的大厂商去推动
  • 硬件也有配套的软件,硬件里一般使用的是嵌入式编程,使用精简的Linux系统,配套软件基本使用C语言编写
  • 当我们的信号机配置工具或者信控平台,需要与信号机进行通信时,遵循约定好的通信协议,进行代码开发,使用socket进行通信接收和传输二进制数据
  • 在做智慧路口的开发时,接收智慧路口的硬件边缘计算单元的数据,使用的也是socket通信协议,根据事先定义的协议,订阅和接收解析数据

心跳与连接

  • 对于平台软件与硬件的socket通信,要特别注意网络的断开与重连,因为在现实网络环境中,即使是内网,网络波动也无法避免
  • 维护好socket通信,处理好连接断开与重连,才能做好这个通信服务
  • 可以通过心跳来保持连接,例如10秒发起一次心跳请求,连续3次没有心跳应答,就认为离线,进行离线情况的处理和尝试重连
  • 但是不能只用心跳,数据通信也算,如果心跳没有应答,但是有数据过来了,这个时候应该也认定是连接正常的(可能是应答信息被海量信息淹没,黏包拆包没处理好,丢掉了)
  • 对于主动断开socket连接,一定要慎重,不仅要有心跳次数校验,也要有数据通信对心跳监测的重置
  • 有时候,糟糕的心跳检测主动断开操作,还不如没有检测

报错与捕获

  • 我们的socket通信都是传输的都是二进制数据,而且都是把数据类型转换成数字,只传输数字类型数据
  • 对于socket通信,最需要注意的就是黏包和拆包问题了,如果没有进行处理,通信并发比较高时,就好导致比较多的解析错误,只能丢掉数据
  • 而且,如果你的报错没处理好,一报错直接就把连接断开了,那就更致命了。在公司联调测试都没问题(少量数据包),一旦部署到生成环境,直接频繁报错重连(大量数据黏包解析报错),直接爆炸
  • 网络连接不稳,数据包丢失,数据不完整,也会解析报错,都有可能
  • 数据不完整,解析会报错,所以一定要处理黏包,要捕获报错,不能一报错就断开连接了
  • 处理黏包拆包的可以参考我这篇博客:关于Netty使用中黏包拆包带来报错问题及解决
  • 如果不是Java语言,或者未使用netty,也可以参考使用里面的思路
  • 简单陈述下思路:
    • 先检验数据报文头,如果不是,丢弃
    • 读到报文头后,插好标记点(报文头前),开始解析处理数据
    • 读取报文头里的数据长度值(一般报文头里都有一个字节表示数据体长度),再获取剩余数据报文体包字节长度,如果小于报文体长度值,重置游标到前面的标记点,结束等待下一个报文来临
    • 如果长度大于等于报文体长度值,按照协议继续解析长度内的报文体,解析完返回,剩下的字节(应该是报文头或者加上一部分数据体),下次再继续解析

文章来源地址https://www.toymoban.com/news/detail-686502.html

到了这里,关于网络编程socket慎重断开连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 网络编程 —— Socket 详解

    在【客户端/服务端】的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式: 除了第一个不带参数的构造方法,其他构造方法都会试图建立与服务器的连接,一旦连接成功,就返回 Socket 对象,否则抛出异常 1. 设定等待建立连接的超时时间

    2024年02月01日
    浏览(27)
  • Java网络Socket编程-websocket

    实现一个用于监测 WebSocket 连接状态的线程类,其作用是通过创建一个 WebSocket 客户端,连接到指定的 WebSocket 地址,并监测连接的状态。 代码中的 WebSocketThread 类继承自 Thread ,意味着它可以在单独的线程中执行。该线程类使用 Tyrus 提供的 @ClientEndpoint 注解来标识这是一个

    2024年02月08日
    浏览(34)
  • Java网络编程-Socket实现数据通信

    本文主要是为下一篇Websockt做铺垫,大家了解socket的一些实现。 网络编程是指利用计算机网络进行程序设计、开发的技术。网络编程主要包含三个要素,分别是: IP地址和端口号 传输协议 Socket 在计算机网络中,每台计算机都有一个IP地址,用于唯一标识该计算机在网络中的

    2024年02月10日
    浏览(31)
  • Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

    Socket 在Java中,Socket是一种用于网络通信的编程接口, 它允许不同计算机之间的程序进行数据交换和通信 。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型 :在Java中,有两种主要类型的Socket,分

    2024年02月10日
    浏览(30)
  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(30)
  • Socket实例,实现多个客户端连接同一个服务端代码&TCP网络编程 ServerSocket和Socket实现多客户端聊天

    Java socket(套接字)通常也称作\\\"套接字\\\",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过\\\"套接字\\\"向网络发出请求或者应答网络请求。 使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再

    2024年02月12日
    浏览(49)
  • python网络编程:处理socket报错“ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。”的问题

    由于这个问题网上的资料特别少,所以在这里记录一下。 当使用socket以udp形式向对方发送数据时(局域网),如果对方的ip和端口未开启,导致未接收,然后使用socket接收时就会出现一串报错信息 产生这个信息的原因是因为发送的信息没有传输成功,而报错的提示会产生在之

    2024年02月09日
    浏览(30)
  • TCP,TCP 连接建立,TCP 连接断开,Socket 编程

    目录 TCP基本认识 TCP 头格式有哪些? 为什么需要 TCP 协议? TCP 工作在哪一层? 什么是 TCP ? 什么是 TCP 连接? #如何唯一确定一个 TCP 连接呢? UDP 和 TCP 有什么区别呢?分别的应用场景是? #TCP 和 UDP 可以使用同一个端口吗? TCP 连接建立 #TCP 三次握手过程是怎样的? 为什么

    2023年04月27日
    浏览(35)
  • 计算机网络技术与JAVA网络编程手写Socket聊天室-----JAVA入门基础教程-----计算机网络经典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    浏览(44)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包