2009-12-17 20 views
7

Tenemos el siguiente código.
A veces debemos esperar 10-20-40 segundos en la última línea.
¿Cuál puede ser el problema?A veces HttpURLConnection.getInputStream se ejecuta demasiado lentamente

Java 1,4

URL url = ...; 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
conn.connect(); 
OutputStream out = conn.getOutputStream(); 
ObjectOutputStream outStream = new ObjectOutputStream(out); 
try 
{ 
    outStream.writeObject(objArray); 
} 
finally 
{ 
    outStream.close(); 
} 

InputStream input = conn.getInputStream(); 

Actualizado:
código siguiente corrige el problema en Eclipse.
Pero aún así no funciona a través de Java Web Start :(

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setUseCaches(false); 
System.setProperty("http.keepAlive", "false"); //<--------------- 
conn.connect(); 

pero ¿por qué?

ACTUALIZADA una vez más!
error se corrigió! :)

trabajamos con conexiones no en una clase pero en dos.
Y hay línea siguiente en la segunda clase:

URL url = ... 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestProperty("Content-Length", "1000"); //<------------ 
conn.connect(); 

Nota: setRequestProperty("Content-Length", "1000") es la causa raíz del problema.

+0

¿Por qué se llama openConnection dos veces? –

+0

Es simplemente un error de impresión. Corregido. –

Respuesta

8

'Tuvimos un problema similar provocado por el buggy keep-alive en Java antiguo. Añadir esto antes de conectar para ver si ayuda,

conn.setRequestProperty("Connection", "close"); 

o

System.setProperty("http.keepAlive", "false"); 
+0

No ayudó :( –

+0

¿Qué tal el segundo enfoque? Realmente necesita publicar un volcado TCP para ver exactamente cuál es el problema. No creo que sea DNS, porque ocurre en la llamada a connect(). –

+0

Me parece que keepAlive = false ayuda. ¿Pero por qué? –

2

Pruébalo con una dirección IP. Para ver si es un problema de DNS.

+0

Solucionamos este problema en diferentes computadoras y en diferentes países :( –

+0

¿Lo ha visto con Wireshark? –

1

El problema puede ser algo de la subcapa de red ... Debería ser difícil encontrarlo.

¿Pero qué pasa con el setReadTimeOut() con un valor bajo y un bucle while?

+0

Utilizamos Java 1.4 –

1

Una cosa que podría adivinar es que su servidor DNS no responde bien.

¿Puede experimentar con el cambio de nombres de dominio simbólicos a direcciones IP numéricas antes de comenzar? ¿O puede hacer cada solicitud dos veces (solo por experimentación) y ver si la primera solicitud es significativamente más lenta que la segunda?

Google ha puesto un servidor DNS en (entre otros) 8.8.8.8. Afirman que es más rápido que la mayoría de los otros servidores DNS. ¡Pruébalo!

+0

Solucionamos este problema en diferentes computadoras y en diferentes países :( –

+0

¿En la misma compañía? ¿Puede el DNS lo mismo dentro de su red privada? – enguerran

+0

No, diferentes compañías, DNS diferentes, redes diferentes –

4

tenía el mismo problema, descubrieron que era causada por IPv6.

deshabilitarla código usando:

System.setProperty("java.net.preferIPv4Stack" , "true"); 

También puede desactivar a través de la línea de comandos usando: g-Djava.net.preferIPv4Stack=true

1

había mismo problema, por lo que cambiar a HTTPClient de Apache, seguir un ejemplo :

HttpClient httpClient = HttpClientBuilder.create().build(); 

HttpPost request = new HttpPost("www.myurl-to-read"); 

RequestConfig requestConfig = RequestConfig.custom() 
           .setSocketTimeout(8000) 
           .setConnectTimeout(10000) 
           .setConnectionRequestTimeout(1000) 
           .build(); 

request.setConfig(requestConfig); 

request.setHeader("Content-type", "application/json"); 

HttpResponse response = httpClient.execute(request); 

HttpEntity entity = response.getEntity(); 
String result = EntityUtils.toString(entity, "UTF-8"); 
Cuestiones relacionadas