java socket重连_Java客户端Socket在服务端重启后的异常情况处理
碰到场景如下: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在服务端重启后的异常情况处理相关推荐
- java socket 阻塞模式_Java中Socket Read阻塞问题
本人来说并不熟悉JAVA语言,只是近期在分析某个简单的java agent程序时,根据对应的代码写了一个对接的程序,两者之间是典型的C/S socket编程.客户端在向服务端发送相应的指令后,服务端( ...
- java socket调用接口_Java中socket接口调用
最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立 ...
- java socket gui登录_java的socket服务端的GUI
这几天做了一个基于socket的宠物商店程序,其中服务端的图形化界面问题困扰了很久.今天终于解决,因此也对多线程有了更好的理解. 想很多新手一样,我其实犯了一个错误. 由于soket服务端端口监听用的 ...
- Socket通信C#项目,完整的服务端和客户端
Socket通信C#项目,完整的服务端和客户端,让您绕过最难写的Socket管理,是困难的多线程处理变成简单的事件处理,非常容易上手. 功能带有断线重连,实时侦测设备状态,简单实用,适合初学者或有迫切 ...
- 多线程+SOCKET编程实现qq群聊的服务端和客户端
多线程+SOCKET编程实现qq群聊的服务端和客户端 标签(空格分隔): 多线程 网络编程 线程同步 一.设计思路 1.服务端 每来一个客户端连接,服务端起一个线程维护: 将收到的消息转发给所有的客户 ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息
目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...
- 客户端渲染和服务端渲染
参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...
- http 缓存分为客户端缓存和服务端缓存
http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...
最新文章
- 使用Scala-IDE构建Maven项目
- CodeIgniter学习笔记一:基本结构、控制器、视图、超级对象、数据库
- PYTHON作业----编写多级菜单
- qt4.7 mysql_详解Qt 4.7编译和访问Mysql驱动
- 人工智能AI实战100讲(六)-利用CNN来检测伪造图像
- 【CodeForces - 471C】MUH and House of Cards (思维,找规律)
- android与js交互
- oracle 数据掩码,oracle格式掩码
- 新代系统plc梯形图说明书_东莞自动化PLC编程需要多少钱
- 第 39 章 ThinkPHP--模型初步(下)
- python matplotlib打开相机
- Industrial Style Transfer with Large-scale Geometric Warping and Content Preservation论文解读
- 装双系统win10和android,厉害了小米6!不仅骁龙835,还支持安卓和win10双系统
- 直方图python_python实现直方图的应用
- 基于Java spring的实验室设备管理系统的设计与实现
- U盘病毒 System Volume Information.exe删不掉
- PostgreSQL 13新特性:fetch first with ties
- 【计科快速入门】 三、布尔逻辑和逻辑门
- 超级码力在线编程大赛初赛 第2场 【题解】
- 军职在线高性能计算机网络答案,全国计算机一级考试题库(附答案).pdf