Oi,
Eu estou com o seguinte problema aqui na minha aplicação:
O mesmo código funciona no java 6, mas não funciona no java 7. Sendo mais específico, eu tenho uma aplicação que navega em sites e baixa informações usando um HTTPClient (org.apache.commons.httpclient v3.algumaCoisa). Debugando o código desse HTTPClient eu vi que o socket que ele abre simplesmente não conecta quando a aplicação é compilada usando Java 7, mas no 6 funciona perfeitamente.
Esse usa uam HTTPConnection que abre o socket por reflection usando a classe ReflectionSocketFactory:
public static Socket createSocket(
final String socketfactoryName,
final String host,
final int port,
final InetAddress localAddress,
final int localPort,
int timeout)
throws IOException, UnknownHostException, ConnectTimeoutException {
if (REFLECTION_FAILED) {
//This is known to have failed before. Do not try it again
return null;
}
// This code uses reflection to essentially do the following:
//
// SocketFactory socketFactory = Class.forName(socketfactoryName).getDefault();
// Socket socket = socketFactory.createSocket();
// SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
// SocketAddress remoteaddr = new InetSocketAddress(host, port);
// socket.bind(localaddr);
// socket.connect(remoteaddr, timeout);
// return socket;
try {
Class socketfactoryClass = Class.forName(socketfactoryName);
Method method = socketfactoryClass.getMethod("getDefault",
new Class[]{});
Object socketfactory = method.invoke(null,
new Object[]{});
method = socketfactoryClass.getMethod("createSocket",
new Class[]{});
Socket socket = (Socket) method.invoke(socketfactory, new Object[]{});
if (INETSOCKETADDRESS_CONSTRUCTOR == null) {
Class addressClass = Class.forName("java.net.InetSocketAddress");
INETSOCKETADDRESS_CONSTRUCTOR = addressClass.getConstructor(
new Class[]{InetAddress.class, Integer.TYPE});
}
Object remoteaddr = INETSOCKETADDRESS_CONSTRUCTOR.newInstance(
new Object[]{InetAddress.getByName(host), new Integer(port)});
Object localaddr = INETSOCKETADDRESS_CONSTRUCTOR.newInstance(
new Object[]{localAddress, new Integer(localPort)});
if (SOCKETCONNECT_METHOD == null) {
SOCKETCONNECT_METHOD = Socket.class.getMethod("connect",
new Class[]{Class.forName("java.net.SocketAddress"), Integer.TYPE});
}
if (SOCKETBIND_METHOD == null) {
SOCKETBIND_METHOD = Socket.class.getMethod("bind",
new Class[]{Class.forName("java.net.SocketAddress")});
}
SOCKETBIND_METHOD.invoke(socket, new Object[]{localaddr});
SOCKETCONNECT_METHOD.invoke(socket, new Object[]{remoteaddr, new Integer(timeout)});
return socket;
}
Alguém saberia dizer se mudou alguma coisa na implementação de Sockets no Java 7? Ou se poderia ser alguma configuração de rede como proxy da empresa que possa estar fazendo com que o socket não conecte?
Lembrando que o código é exatamente o mesmo e fuciona perfeitamente quando compilado com o 6.
Obrigado!