文档章节

服务端崩溃后,socket客户端不发送推

wilbur_li
 wilbur_li
发布于 2017/03/16 11:18
字数 548
阅读 28
收藏 0

刚遇到的现场问题,请原谅我文笔单调。

现场问题调查:使用socket推送各个银行,下发任务如果有一家支行卡住了,后面的支行T+1任务就下发不下去了。

修改思路:服务端奔溃,客户端不会创建新的socket请求,可能原因在于socket未正常关闭。

修改方式:

1,socket连接关闭写到finally里面,保证其关闭。

2,既然只是单线推送,为什么不把输入流关闭呢(猜测)

3,设置socket超时时间,不让客户端无限等待。

 

之前代码:

 

try {

// 发出客户请求

Socket socket = new Socket(ip, port);

// 由Socket对象得到输出流,并构造PrintWriter对象

PrintWriter os = new PrintWriter(socket.getOutputStream());

// 由Socket对象得到输入流,并构造相应的BufferedReader对象

BufferedReader is = new BufferedReader(new InputStreamReader(

socket.getInputStream()));

// 写入数据

os.println(message);

// os.write(tableNumber);

// 刷新输出流,使Server马上收到该字符串

os.flush();

System.out.println("Client:" + message);

// 在输出上打印服务器端返回的字符串

String readline = is.readLine();

System.out.println("Server:" + readline);

os.close(); // 关闭Socket输出流

is.close(); // 关闭Socket输入流

socket.close();// 关闭Socket

} catch (Exception e) {

System.out.println("Error" + e); // 出错,则打印出错信息

count++;

if (count!=3) {

createSocket(ip,port,message);

}

logger.info("count="+count);

}

 

 

修改后:

 

Socket socket = null;

try {

// 发出客户请求

// socket = new Socket(ip, port);

socket = new Socket();

SocketAddress socketAddress = new InetSocketAddress(ip, port);

// 超时时间占时设置2分钟

socket.connect(socketAddress, 120000);

// 由Socket对象得到输出流,并构造PrintWriter对象

PrintWriter os = new PrintWriter(socket.getOutputStream());

// 由Socket对象得到输入流,并构造相应的BufferedReader对象

// 分析服务器不返回任何值 输入流没必要存在

// BufferedReader is = new BufferedReader(new InputStreamReader(

// socket.getInputStream()));

// 写入数据

os.println(message);

// os.write(tableNumber);

// 刷新输出流,使Server马上收到该字符串

os.flush();

System.out.println("Client:" + message);

// 在输出上打印服务器端返回的字符串

// String readline = is.readLine();

// System.out.println("Server:" + readline);

os.close(); // 关闭Socket输出流

// is.close(); // 关闭Socket输入流

// socket.close();// 关闭Socket

} catch (Exception e) {

System.out.println("Error" + e); // 出错,则打印出错信息

count++;

if (count<=3) {

createSocket(ip,port,message);

}

logger.info("count="+count);

} finally {

try {

if(socket != null) {

socket.close();

logger.info("关闭Socket ip:" + ip + " port" + port);

}

} catch (Exception e2) {

// TODO: handle exception

socket = null;

logger.info("finally异常:"+ e2.getMessage());

}

}

© 著作权归作者所有

wilbur_li
粉丝 0
博文 5
码字总数 1061
作品 0
上海
后端工程师
私信 提问
TCP异常关闭研究分析

版权声明:本文由谢代斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qcloud.com/community 研究测试TCP断开和异常的各...

偶素浅小浅
2016/11/02
91
0
异常测试之Socket网络异常

本文由作者张雨授权网易云社区发布。 前言 不知道大家在测试的过程中有没有发现关于异常测试这样一个特点: 无论是分散在功能测试中的异常用例还是规模相对较大的专项异常测试中,异常测试的...

网易云
2018/12/14
0
0
tcp 服务端如何判断客户端断开连接

最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题,如果...

陈国成
2017/06/15
0
0
php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示。 2. 长轮询,ajax请求服务端,服务端有数据会立即返回。服务端无数据时会一直等待,直到有...

hgditren
2017/01/10
0
0
关于TCP长连接和发送心跳的一些理解

作者:郭无心 链接:https://www.zhihu.com/question/35013918/answer/63664974 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 游戏服务器常常有心跳包的设计。 我们的心跳包就是为...

huang19830104
2018/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
4
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
7
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
10
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
14
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部