博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修补PHPRPC_Client中(JAVA版本),创建Socket连接时Timeout不起作用
阅读量:5131 次
发布时间:2019-06-13

本文共 1755 字,大约阅读时间需要 5 分钟。

起因,一个项目使用phprpc作为通信协议,在进行产品测试时发现,如果关闭远程服务器的Web服务,在这种情况下任然使用PHPRPC_Cilent对象连接服务器,会有将近3分钟的赌赛阻断,包括设置了PHPRPC_Cilent.Timeout属性也一样。我调用的代码如下:

// TODO Auto-generated method stub
String Url=GlobalInfo.GetWebServerURL()+"/LoginService.aspx";
PHPRPC_Client client = new PHPRPC_Client(Url);
client.setTimeout(5);
client.setEncryptMode(0);//不加密
String result="0";
try {
result =Cast.toString(client.invoke("TestNet", null));
} catch (Exception e) {
// TODO: handle exception
android.util.Log.d(GlobalInfo.DebugTag, e.toString());
}

后来查看PHPRPC源码找到原因.org.phprpc.SocketPool.newSocket()为PHPRPC创建Socket的方法,此方法里面是在创建链接之后再设置Timeout.所以在链接创建之时使用的是服务器默认的超时时间.原本文件如下

private final Socket newSocket() throws IOException {
Socket socket = socketFactory.createSocket(host, port);
socket.setSoTimeout(timeout);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
return socket;
}

我进行了修补,源码如下。思路

1.用socketFactory.createSocket()创建一个空的Socket对象。

2.然后再使用socket.connect(remoteaddr,timeout),进行连接远程服务器,使Timeout起效果。

private final Socket newSocket() throws IOException {
 
/*@@@@下面是原始代码,我对此代码进行了修改
* 修改时间:2011-11-8 11:56
* 修改内容:设置响应超时包括到链接创建时
* 源码原版:
* Socket socket = socketFactory.createSocket(host, port);
socket.setSoTimeout(timeout);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
return socket;*/
if (timeout == 0) {
Socket socket = socketFactory.createSocket(host, port);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
return socket;
}else {
Socket socket = socketFactory.createSocket();
SocketAddress remoteaddr = new InetSocketAddress(host, port);
socket.connect(remoteaddr, timeout);
socket.setSoTimeout(timeout);
socket.setTcpNoDelay(true);//数据不作缓冲,立即发送
socket.setKeepAlive(true);
return socket;
 
}
}

转载于:https://www.cnblogs.com/edzjx/archive/2011/11/08/2240942.html

你可能感兴趣的文章
统计学的统一(1)
查看>>
实验四2
查看>>
用CSS3画出一个立方体---转
查看>>
date
查看>>
C#实现Winform间的数据交互的三种方法
查看>>
java项目中rmi远程调用实例
查看>>
5.分组函数
查看>>
java_Observer Design Pattern
查看>>
【c++编程思想】字符串
查看>>
Python入门神图
查看>>
CentOS 7.0安装
查看>>
在小程序开发的新风口 看华为云如何助立创科技抢占市场红利
查看>>
第一次博客随笔:苏钰冰
查看>>
HIS-DELPHI-读取数据库配置
查看>>
如何引入iconfont图标与Element-UI组件
查看>>
获取Model的所有属性字符串
查看>>
设计模式--模板方法 And State模式
查看>>
模板方法模式分析、图表和基本代码
查看>>
ArcMap合并之路 -- 该段路合并成一个完整的路
查看>>
该文件没有程序与之关联来运行该操作。请在控制面板的目录选项中创建关联 解决代码...
查看>>