2011-08-31 9 views
6

Il mio codice è qui:Crea SSLSocket da SSLSocketFactory con timeout di connessione insieme

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(null, getAllCerts(), new SecureRandom()); 
SSLSocketFactory factory = sslContext.getSocketFactory(); 
mSocket = (SSLSocket) factory.createSocket("myhost.com", socketPort[index]); 

devo controllare tavolo di porte e scegliere quella aperta. Tutto funziona bene, ma su createSocket() la mia applicazione perde un sacco di tempo. Se ho 5 porte e l'ultima è aperta, la connessione richiede circa 3 minuti.

Come posso impostare il timeout su SSLSocketFactory per accelerare la connessione?

+0

Io non sono molto sicuro di come ci si aspetta di accelerare il processo di connessione impostando un timeout. Dove viene eseguito il tuo codice? In un AsyncTask? In un servizio? Qualunque trasferimento di dati iniziale? Hai preso in considerazione una SSLSessionCache? –

+0

Hai trovato una soluzione? Sto affrontando lo stesso problema, e sarebbe bello se si potesse pubblicare la soluzione ... Grazie in anticipo –

risposta

2

Prova avvolgendo un socket esistente invece:

Socket socketConn = new Socket(); 
socketConn.connect(addr, DEFAULT_CONNECT_TIMEOUT); 
mSocket = socketConn.getSocketFactory().createSocket(socketConn, hostname, port, true); 
+2

Hai provato questo? Mi aspetterei che il metodo createSocket() nell'ultima riga chiudesse prima il socket, perché è già in uno stato connesso (non SSL). Inoltre, secondo i documenti, le factory Socket SSL con un timeout di handshake SSL specificato resettano il timeout del socket sottostante a 0 (ovvero senza timeout) dopo che il protocollo SSL ha terminato di stabilire la connessione. –

+1

@ClassStacker Ti stai sbagliando. L'ho fatto. Funziona. (1) Questo è il modo in cui implementate il comando STARTTLS di SMTP, LSAP, ecc., Quindi troverete la stessa cosa all'interno di JavaMail, del provider LDAP JNDI, ecc. (2) Questo è un timeout di connessione, non un timeout di lettura, che è la tua frase finale. (3) Si prega di citare un riferimento per tale affermazione. La parola "timeout" non appare in Javadoc per SSLSocketFactory * o * SSLSocket, tranne nel secondo caso come riferimento ai metodi ereditati da Socket. – EJP

+0

Non funziona nel mio caso perché dovevo assicurarmi che il socket fosse collegato a una certa rete. Con 'new Socket()' il socket sarà ancora associato alla rete predefinita. – winklerrr

6

Nel caso in cui si sta ancora chiedendo, è possibile utilizzare l'idea dato in https://groups.google.com/forum/#!topic/android-developers/EYtMO5WoXXI

import javax.net.ssl.SSLSocketFactory; 

// Create a socket without connecting 
SSLSocketFactory socketFactory = SSLSocketFactory.getDefault(); 
Socket socket = socketFactory.createSocket(); 

// Connect, with an explicit timeout value 
socket.connect(new InetSocketAddress(endpoint.mServer, 
endpoint.mPort), CONNECT_TIMEOUT); 
+1

Questo ha fatto il trucco per me! Non pensavo alla possibilità di creare un socket senza una connessione. – winklerrr