碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一下。

同步IO客户端既发也收

在服务端A重启后,B再次发送数据到A(虽然socket连接已断,但这个过程无异常,但其实数据并无法发送),然后B从A读数据的结果中,inputStream.read(byte[] array)会返回-1,表示end-of-file。

这种情况就比较好处理,在底层获取到end-of-file后抛出个异常,上层捕获异常后通知底层进行新建socket重连,然后上层再重发数据再读回包即可。

同步IO客户端只发不收

在服务端A重启后,B尝试第一次发送数据到A(虽然socket连接已断,但这个过程无异常,检测socket.isConnected()=true或者socket.isClosed()=false也都显示正常,但其实数据并无法发送),当B第二次再发送数据到A,在outputStream.write中,会报异常java.net.SocketException: Broken pipe。

所以通过抓取异常重连重发的办法,要在第二次发送失败时才能被发现并work。

客户端不发只收

这种情况在实践中感觉比较少见,即使业务逻辑如此,客户端应该也要发送心跳包到服务器,然后就是 既发也收 了。

异步IO客户端

如果客户端也是NIO的异步IO方式,在服务端A正常关闭时,客户端B会接收到SelectionKey.isReadable() == true的通知,然后从SocketChannel中read返回-1值,表示EOF,就可以处理关闭链接,然后下一次write的时候就可以进行重连了。

如果是服务端非正常关闭,比如断电、宕机等情况,有待验证,理论上应该不会返回read通知也不会返回-1的结果。

java socket重连_Java客户端Socket在服务端重启后的异常情况处理相关推荐

  1. java socket 阻塞模式_Java中Socket Read阻塞问题

    本人来说并不熟悉JAVA语言,只是近期在分析某个简单的java agent程序时,根据对应的代码写了一个对接的程序,两者之间是典型的C/S socket编程.客户端在向服务端发送相应的指令后,服务端( ...

  2. java socket调用接口_Java中socket接口调用

    最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立 ...

  3. java socket gui登录_java的socket服务端的GUI

    这几天做了一个基于socket的宠物商店程序,其中服务端的图形化界面问题困扰了很久.今天终于解决,因此也对多线程有了更好的理解. 想很多新手一样,我其实犯了一个错误. 由于soket服务端端口监听用的 ...

  4. Socket通信C#项目,完整的服务端和客户端

    Socket通信C#项目,完整的服务端和客户端,让您绕过最难写的Socket管理,是困难的多线程处理变成简单的事件处理,非常容易上手. 功能带有断线重连,实时侦测设备状态,简单实用,适合初学者或有迫切 ...

  5. 多线程+SOCKET编程实现qq群聊的服务端和客户端

    多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...

  6. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  7. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  8. 客户端渲染和服务端渲染

    参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...

  9. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

最新文章

  1. 使用Scala-IDE构建Maven项目
  2. CodeIgniter学习笔记一:基本结构、控制器、视图、超级对象、数据库
  3. PYTHON作业----编写多级菜单
  4. qt4.7 mysql_详解Qt 4.7编译和访问Mysql驱动
  5. 人工智能AI实战100讲(六)-利用CNN来检测伪造图像
  6. 【CodeForces - 471C】MUH and House of Cards (思维,找规律)
  7. android与js交互
  8. oracle 数据掩码,oracle格式掩码
  9. 新代系统plc梯形图说明书_东莞自动化PLC编程需要多少钱
  10. 第 39 章 ThinkPHP--模型初步(下)
  11. python matplotlib打开相机
  12. Industrial Style Transfer with Large-scale Geometric Warping and Content Preservation论文解读
  13. 装双系统win10和android,厉害了小米6!不仅骁龙835,还支持安卓和win10双系统
  14. 直方图python_python实现直方图的应用
  15. 基于Java spring的实验室设备管理系统的设计与实现
  16. U盘病毒 System Volume Information.exe删不掉
  17. PostgreSQL 13新特性:fetch first with ties
  18. 【计科快速入门】 三、布尔逻辑和逻辑门
  19. 超级码力在线编程大赛初赛 第2场 【题解】
  20. 军职在线高性能计算机网络答案,全国计算机一级考试题库(附答案).pdf

热门文章

  1. 干货 | android下使用的渗透工具介绍
  2. 如何保护个人信息安全? 网约车八问题被明确解答
  3. 米哈游被金融割韭菜,赚太多不会花钱也是个问题
  4. React弹出框(简易版)
  5. 菜鸟修炼笔记--QT--【问题】界面切换时焦点各种异常的处理
  6. 什么游戏耳机性价比高?值得入手的蓝牙游戏耳机
  7. python3通过qq邮箱发送邮件
  8. vue父子组件通信详解
  9. 克里斯那穆提:爱就是自由——双方都自由
  10. 为什么要学习和使用 C 语言?