Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以设置默认的全局Java套接字超时吗?_Java_Sockets - Fatal编程技术网

我可以设置默认的全局Java套接字超时吗?

我可以设置默认的全局Java套接字超时吗?,java,sockets,Java,Sockets,我遇到了一个问题,应用程序中涉及http和ftp连接的各个位置在java.net.SocketInputStream.socketRead0上无限期地挂起(在终止java进程之前一次观察几个小时) 我希望全局覆盖默认套接字超时0,这样我就不必在启动连接的每个位置都设置它。是否可以调用一些全局Java属性或方法来将默认套接字超时设置为0以外的值?这取决于代码的编写方式。在我看来,您应该创建一个APIClient,负责进行http/ftp调用并将响应返回给调用方函数。 也就是说,每个http/ftp

我遇到了一个问题,应用程序中涉及http和ftp连接的各个位置在java.net.SocketInputStream.socketRead0上无限期地挂起(在终止java进程之前一次观察几个小时)


我希望全局覆盖默认套接字超时0,这样我就不必在启动连接的每个位置都设置它。是否可以调用一些全局Java属性或方法来将默认套接字超时设置为0以外的值?

这取决于代码的编写方式。在我看来,您应该创建一个APIClient,负责进行http/ftp调用并将响应返回给调用方函数。 也就是说,每个http/ftp调用都必须通过这个APIClient文件。最好有一个类参数/常量,它以毫秒为单位存储超时,然后在进行http/ftp调用时将该常量用作超时

public abstract class WebServiceAPIClient {
    protected String authUser;
    protected String authPassword;
    // Set the connection timeout whatever you want...
    final Integer connectionTimeOut = 60000;

    public WebServiceAPIClient(String user, String pwd, int errorCode) {
        this.authUser = user;
        this.authPassword = pwd;
        this.errorIdentiferCode = errorCode;
    }

    public String requestRESTGet(String url, List<Integer> successCodes, boolean addBasicAuth) throws CloudWebServiceInvocationException {
    Long start = System.currentTimeMillis();
    HttpGet get = new HttpGet(url);
    DefaultHttpClient client = getHttpClient();
    try {
        if (addBasicAuth)
            addHeaders(get);
        HttpResponse response = client.execute(get);
        return responseAsString(response);
    } catch (ClientProtocolException e) {
        internalServerError(e);
    } catch (IOException e) {
        internalServerError(e);
    } finally {
        client.getConnectionManager().shutdown();
    }
    return "";
 }

  protected DefaultHttpClient getHttpClient() {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpParams params = client.getParams();
    if (this.connectionTimeOut != null) {
        HttpConnectionParams.setConnectionTimeout(params, this.connectionTimeOut);
        HttpConnectionParams.setSoTimeout(params, 3 * this.connectionTimeOut);
    }
    return client;
}
公共抽象类webservicepiclient{
受保护的字符串身份验证用户;
受保护的字符串身份验证密码;
//根据需要设置连接超时。。。
最终整数connectionTimeOut=60000;
公共WebServiceAppClient(字符串用户、字符串pwd、int错误代码){
this.authUser=user;
this.authPassword=pwd;
this.errorIdentiferCode=错误代码;
}
公共字符串requestRESTGet(字符串url、列表成功代码、布尔addBasicAuth)抛出CloudWebServiceInLocationException{
长启动=System.currentTimeMillis();
HttpGet=新的HttpGet(url);
DefaultHttpClient=getHttpClient();
试一试{
if(addBasicAuth)
addHeaders(get);
HttpResponse response=client.execute(get);
返回responseAsString(response);
}捕获(客户端协议例外e){
内部错误(e);
}捕获(IOE异常){
内部错误(e);
}最后{
client.getConnectionManager().shutdown();
}
返回“”;
}
受保护的DefaultHttpClient getHttpClient(){
DefaultHttpClient=新的DefaultHttpClient();
HttpParams params=client.getParams();
if(this.connectionTimeOut!=null){
HttpConnectionParams.setConnectionTimeout(params,this.connectionTimeOut);
HttpConnectionParams.setSoTimeout(参数,3*this.connectionTimeOut);
}
返回客户;
}

}

这取决于应用程序如何创建套接字。如果应用程序代码使用URLConnection,则可以使用JVM属性设置默认超时:

-Dsun.net.client.defaultReadTimeout=30000
-Dsun.net.client.defaultConnectTimeout=5000
此属性是特定于实现的,但仍然适用于最新的Oracle/OpenJDK


hmm现在,您可以在全局访问的位置定义
静态final
变量并使用它,以避免调用。hmm我不知道,但我认为不存在这种情况