您的位置:首页 > 编程语言 > PHP开发

修补PHPRPC_Client中(JAVA版本),创建Socket连接时Timeout不起作用

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

[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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐