zoukankan      html  css  js  c++  java
  • 修补PHPRPC_Client中(JAVA版本),创建Socket连接时Timeout不起作用

    起因,一个项目使用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;
            
        }
    }
  • 相关阅读:
    PyTorch Tutorials——LEARN THE BASICS
    vscode+remote ssh搭建《dive into deep learning》所需环境
    node.js02 安装Node环境
    node.js01 认识node.js
    二分查找
    暴力枚举
    博客园自定义域名
    斐波那契数列(公兔子掳母兔子问题)
    为什么我要写博客?
    C++基本语法
  • 原文地址:https://www.cnblogs.com/edzjx/p/2240942.html
Copyright © 2011-2022 走看看