修补PHPRPC_Client中(JAVA版本),创建Socket连接时Timeout不起作用
2011-11-08 12:05
477 查看
起因,一个项目使用phprpc作为通信协议,在进行产品测试时发现,如果关闭远程服务器的Web服务,在这种情况下任然使用PHPRPC_Cilent对象连接服务器,会有将近3分钟的赌赛阻断,包括设置了PHPRPC_Cilent.Timeout属性也一样。我调用的代码如下:
[/code]
后来查看PHPRPC源码找到原因.org.phprpc.SocketPool.newSocket()为PHPRPC创建Socket的方法,此方法里面是在创建链接之后再设置Timeout.所以在链接创建之时使用的是服务器默认的超时时间.原本文件如下
[/code]
我进行了修补,源码如下。思路
1.用socketFactory.createSocket()创建一个空的Socket对象。
2.然后再使用socket.connect(remoteaddr,timeout),进行连接远程服务器,使Timeout起效果。
[/code]
[code]// 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());
}
[/code]
后来查看PHPRPC源码找到原因.org.phprpc.SocketPool.newSocket()为PHPRPC创建Socket的方法,此方法里面是在创建链接之后再设置Timeout.所以在链接创建之时使用的是服务器默认的超时时间.原本文件如下
[code]private final Socket newSocket() throws IOException {
Socket socket = socketFactory.createSocket(host, port);
socket.setSoTimeout(timeout);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
return socket;
}
[/code]
我进行了修补,源码如下。思路
1.用socketFactory.createSocket()创建一个空的Socket对象。
2.然后再使用socket.connect(remoteaddr,timeout),进行连接远程服务器,使Timeout起效果。
[code]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;
}
}
[/code]
相关文章推荐
- HttpClient 频繁创建连接,导致socket端口全部耗尽
- socket C/C++编程(6)server之accept()函数创建新socket以单独读取缓存区某个client的连接信息(客户端的IP和端口,但是,不包括client端键入的数据)
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- HttpClient java.net.SocketTimeoutException: Read timed out!
- 使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题.
- java socketTimeOut, jdbc timeout 连接超时时间
- java|android 使用socket.io-client连接nodejs websocket
- 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题.
- ElasticSearch java API--创建Client连接
- 在java中使用solr7.2.0 新旧版本创建SolrClient对比
- .net , java webSocket 连接 Socket.io (1.4.4版本) 问题
- 使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题
- 在java中使用solr7.2.0 新旧版本创建SolrClient对比
- java|android 使用socket.io-client连接nodejs websocket
- HttpClient 4.5.2版本设置连接超时时间-CloseableHttpClient设置Timeout
- 在JAVA中利用SOCKET创建一个用于收发报文的长连接服务器
- java连接mongod抛java.net.SocketTimeoutException: connect timed out异常(2015-11-07 20:29:58)
- HandlerSocket client for java――hs4j正式发布0.1版本
- Kafka java client 连接异常(org.apache.kafka.common.errors.TimeoutException: Failed to update metadata )
- android Socket连接【java.net包实现的socket连接client】