Tôi đang phát triển một ứng dụng Android sử dụng SSLSocket để kết nối với máy chủ. Đây là mã Tôi đang sử dụng:Kết nối TLS sử dụng SSLSocket chậm trong Hệ điều hành Android
// Connect
if (socket == null || socket.isClosed() || !socket.isConnected()) {
if (socket != null && !socket.isClosed())
socket.close();
Log.i(getClass().toString(), "Connecting...");
if (sslContext == null) {
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());
}
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
socket = (SSLSocket)socketFactory.createSocket(host, port);
socket.setSoTimeout(20000);
socket.setUseClientMode(true);
connected = true;
Log.i(getClass().toString(), "Connected.");
}
// Secure
if (connected) {
Log.i(getClass().toString(), "Securing...");
SSLSession session = socket.getSession();
secured = session.isValid();
if (secured) {
Log.i(getClass().toString(), "Secured.");
}
else
Log.i(getClass().toString(), "Securing failed.");
}
Vấn đề là phải mất khoảng 5 giây hoặc sự kiện hơn để làm những cái bắt tay TLS trong dòng dưới đây:
SSLSession session = socket.getSession();
Tôi đã thực hiện một tương tự Ứng dụng iPhone, cái bắt tay chỉ mất 1 giây ở đó, vì vậy tôi nghĩ vấn đề không nằm trong máy chủ mà tôi đang kết nối đến, nó có thể nằm trong đoạn mã trên. Kết nối chính nó là đủ nhanh, chỉ cần bắt tay TLS là chậm.
Có ai biết nếu nó bình thường trong Android, hoặc nếu không, làm thế nào để làm cho nó nhanh hơn?
Cảm ơn bạn.
edited on 21.01.11:
Tôi đã phát hiện ra, rằng cái bắt tay là nhanh khi kết nối với máy chủ khác, ví dụ paypal.com:443.
Nhưng trước đó tôi đã kết nối với một máy chủ khác - dịch vụ .NET do tôi viết. Như tôi đã nói trước đây, tôi đã không nghĩ rằng vấn đề là trong máy chủ đó bởi vì nếu tôi kết nối với nó với iPhone App của tôi bắt tay là nhanh. Bây giờ tôi không biết tại sao nó nhanh trên iPhone và chạy chậm trên Android. Sau khi kết nối được thiết lập, điều duy nhất tôi làm trong máy chủ .NET là:
Console.WriteLine("New client connected.");
this.sslStream = new SslStream(tcpClient.GetStream(), true);
this.sslStream.ReadTimeout = 15000;
this.sslStream.WriteTimeout = 15000;
Console.WriteLine("Beginning TLS handshake...");
this.sslStream.AuthenticateAsServer(connection.ServerCertificate, false, SslProtocols.Tls, false);
Console.WriteLine("TLS handshake completed.");
Có Tôi biết rằng TLS thường chậm hơn kết nối thuần túy nhưng đủ nhanh. Việc bắt tay TLS tuy nhiên rất chậm, phải mất 10 giây, không phải 5 như tôi đã nói trước đây. – Arthur