2013-12-18 97 views
0

嗨,我正在开发Java应用程序并部署在Jboss,Windows 8服务器上。在我的服务器代码中,我使用HttpUrlconnection与我的产品进行通信。由于连接拒绝,Java HttpUrlConnection连接超时不工作

我想为evey连接设置一个时间限制来连接我的产品。所以我使用HttpUrlconnection.setconnectionTimeout(30000) 30秒的时间限制。但在9分钟时连接被拒绝。 HttpUrlconnection.setconnectionTimeout()目前无法使用。

我已经发现TCP超时发生的问题,并已在Windows 8服务器中设置了重传限制。默认情况下,TCP重新传输限制为2.尝试2次后,连接将被放弃或拒绝。

我的问题是,如何在不更改Windows注册表文件的情况下从java端避免此问题?这意味着可以设置超时或重试TCP SYN/RST/ACK机制来避免连接被拒绝的问题。

是否有任何人知道,请帮我解决这个问题

url = new URL(requestURL); 
HttpURLConnection connection = (HttpURLConnection) 
url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
connection.setConnectTimeout(30000 
connection.setReadTimeout(30000; 

try { 
    // Get Response 
    inputStream = connection.getInputStream(); 
} catch (IOException e) { 
    //    
} 

唯一的例外是下面

java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
+0

是'connection.setConnectTimeout(30000'和'connection.setReadTimeout(30000;'这里只有错误吗?' – ChiefTwoPencils

回答

0

这连接被拒绝意味着没有任何程序在连接的另一端听/希望你的连接。如果您的产品稍后会打开,则需要手动重新尝试连接;不用等待连接尝试'流连忘返',以便在程序启动时连接。老实说,它看起来像你的连接逻辑屁股后退:它看起来像你试图从长期运行的程序(服务器)连接到短期运行的程序(客户端);反过来,并让服务器监听连接,并且客户端在启动时应该连接到服务器。

0

连接超时是针对没有响应的情况。连接拒绝是一个响应,所以超时不适用。

+0

嗨,我明白了你的观点,但由于防火墙或其他原因,我无法连接我的设备。那个时候当我调用http请求时,它会在调用java.net.PlainSocketImpl.socketConnect(Native Method)时通过TCP向设备发送SYN数据包,它试图从设备获取确认,它只尝试两次,因为Windows注册的TcpMaxDataRetransmissions为2。经过两次失败,它放弃了请求,所以异常发生了。是否有可能延长重试或延长TCP超时由java? – Murali

+0

我不能使头部或尾部,我只能重复如果有任何响应在超时之前种类,超时不适用,包括SYN/ACK和RST。 – EJP