2011-08-31 9 views
6

Mój kod jest tutaj:Tworzenie SSLSocket przez SSLSocketFactory z czasu ustawionego połączenia

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

muszę sprawdzić tabelę portów i wybrać jedną otwartą. Wszystko działa dobrze, ale na createSocket() moja aplikacja traci dużo czasu. Jeśli mam 5 portów, a ostatni jest otwarty, nawiązywanie połączenia zajmuje około 3 minut.

Jak ustawić limit czasu na SSLSocketFactory, aby przyspieszyć połączenie?

+0

Nie jestem pewien, jak można oczekiwać, aby przyspieszyć proces łączenia przez ustawienie limitu czasu. Gdzie działa twój kod? W AsyncTask? W usłudze? Wszelkie początkowe transfery danych? Czy zastanawiałeś się nad SSLSessionCache? –

+0

Czy znalazłeś rozwiązanie? Mam do czynienia z tym samym problemem i byłoby wspaniale, gdybyś mógł zamieścić swoje rozwiązanie ... Z góry dzięki –

Odpowiedz

2

Spróbuj zawijania istniejącego gniazda zamiast:

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

Czy to testowałeś? Spodziewałbym się, że metoda createSocket() w twoim ostatnim wierszu zamknie najpierw gniazdo, ponieważ jest już w stanie połączonym (bez SSL). Ponadto zgodnie z dokumentami, SSL Socket Factories z określonym limitem czasu uzgadniania SSL resetuje limit czasu gniazdowego do 0 (inaczej nie ma limitu czasu) po zakończeniu protokołu SSL ustanawiającego połączenie. –

+1

@ ClassStacker Jesteś w błędzie. Zrobiłem to. To działa. (1) W ten sposób zaimplementowano komendę STARTTLS SMTP, LSAP itp., Więc znajdziecie to samo w JavaMail, dostawcy JNDI LDAP itp. (2) Jest to limit czasu połączenia, a nie limit czasu odczytu, który na tym polega twoje ostatnie zdanie. (3) Proszę podać odniesienie do tego roszczenia. Słowo "limit czasu" nie pojawia się w Javadoc dla SSLSocketFactory * lub * SSLSocket, z wyjątkiem tego ostatniego przypadku jako odniesienia do metod odziedziczonych po Socket. – EJP

+0

Nie działa w moim przypadku, ponieważ musiałem upewnić się, że gniazdo było powiązane z pewną siecią. Przy 'new Socket()' gniazdo nadal będzie wiązało się z domyślną siecią. – winklerrr

6

w przypadku, gdy są wciąż zastanawiasz się, można użyć pojęcia podaną w 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

To mi się udało! Nie myślałem o możliwości utworzenia gniazda bez połączenia. – winklerrr

Powiązane problemy