Zacepin

530
-1

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
530
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Zacepin

  1. 1. А л е к с а н д р З а це п и нразработчик, Мобильная почта/Почта a l e x a n d e r. z a t s e p i n @ m a i l . r u
  2. 2. Работа с сетью в Android
  3. 3. 800 000700 000600 000500 000400 000 Приложения300 000200 000100 000 0 2009 2010 2011 2012
  4. 4. Более 800000 приложений
  5. 5. Server
  6. 6. Сокеты ServerClient ServerSocket Socket
  7. 7. Частые опросы (Polling) Server
  8. 8. Длинные опросы (Long-Polling) Server
  9. 9. Пуш-нотификации System Long-polling GCM subscribes regIdApp Server
  10. 10. Виды возможных сетевых взаимодействий в Андроид1. Сокеты2. Длинные опросы (Long-polling)3. Пуш-нотификации (Google Cloud Messaging(GCM))4. Частые опросы сервера (Polling)
  11. 11. Виды возможных сетевых взаимодействий в Андроид1. Сокеты2. Длинные опросы (Long-polling)3. Пуш-нотификации (Google Cloud Messaging(GCM))4. Частые опросы сервера (Polling)
  12. 12. Виды возможных сетевых взаимодействий в Андроид1. Сокеты2. Длинные опросы (Long-polling)3. Пуш-нотификации (Google Cloud Messaging(GCM))4. Частые опросы сервера (Polling)
  13. 13. HttpUrlConnection Server
  14. 14. HttpUrlConnection Server HttpContext HttpRequest HttpEntityHttpClient Server HttpResponse HttpEntity
  15. 15. HttpUrlConnection connection = null;try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection();
  16. 16. HttpUrlConnection connection = null;try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain");
  17. 17. HttpUrlConnection connection = null;try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect();
  18. 18. HttpUrlConnection connection = null;try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect(); int statusCode = connection.getResponseCode(); ...
  19. 19. HttpUrlConnection connection = null;try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect(); int statusCode = connection.getResponseCode(); ... readTextFromServer();} catch (Exception e) { e.printStackTrace();} finally { if (connection != null) { connection.disconnect(); }}
  20. 20. try { HttpGet request = new HttpGet("http://example.com");
  21. 21. try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain");
  22. 22. try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request);
  23. 23. try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request); int statusCode = response.getStatusLine().getStatusCode(); ...
  24. 24. try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request); int statusCode = response.getStatusLine().getStatusCode(); ... return EntityUtils.toString(response.getEntity());} catch (Exception e) { e.printStackTrace();}
  25. 25. HttpUrlConnection Server HttpContext HttpRequest HttpEntityHttpClient Server HttpResponse HttpEntity
  26. 26. HttpUrlConnectionHttpUrlConnection Server …HttpUrlConnection App
  27. 27. HttpUrlConnection HttpUrlConnection Server … HttpUrlConnection App HttpContext HttpRequest HttpEntityHttpClient Server HttpResponse HttpEntity App
  28. 28. Потокобезопасность 1 2 HttpUrlConnection Thread N
  29. 29. Потокобезопасность 1 2 HttpUrlConnection Thread N
  30. 30. Потокобезопасность HttpClient 1 2 Thread N
  31. 31. Потокобезопасность HttpClient 1 2 ThreadSafeClientConnManager Thread N 1 connection 1 ... connection N 2 connection 2
  32. 32. Потокобезопасностьstatic { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10);
  33. 33. Потокобезопасностьstatic { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } });
  34. 34. Потокобезопасностьstatic { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } }); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);}
  35. 35. Потокобезопасностьstatic { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } }); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); httpClient = new DefaultHttpClient(cm, params);}
  36. 36. Applicationrequest request ... request request Server
  37. 37. Applicationrequest request ... request request TCP TCP TCP TCP Server
  38. 38. Applicationrequest request ... request request TCP + TCP …+… TCP + TCP = traffic Server
  39. 39. Keep-alive cоединение
  40. 40. Keep-alive cоединение Applicationrequest request ... request request TCP Server
  41. 41. Keep-alive cоединение Applicationrequest request ... request request TCP + …+… + = traffic Server
  42. 42. Номер Время(ms)запроса KeepAlive = false 1 2098 2 2157 3 2037 4 2096 5 1944 6 2055 7 1865 8 2119 9 1986 10 1965 ≈2032,2
  43. 43. Номер Время(ms) Время(ms)запроса KeepAlive = false KeepAlive = true 1 2098 2023 2 2157 1604 3 2037 1698 4 2096 1774 5 1944 1173 6 2055 1573 7 1865 1683 8 2119 1670 9 1986 1666 10 1965 1541 ≈2032,2 ≈1700,5
  44. 44. Номер Время(ms) Время(ms)запроса KeepAlive = false KeepAlive = true 1 2098 2023 2 2157 1604 3 2037 1698 4 2096 1774 На 16,2% быстрее! 5 1944 1173 6 2055 1573 7 1865 1683 8 2119 1670 9 1986 1666 10 1965 1541 ≈2032,2 ≈1700,5
  45. 45. Keep Alive Duration
  46. 46. Keep Alive Duration𝐭 App 𝐭 − 𝐭𝐢𝐦𝐞
  47. 47. Keep Alive Duration request1𝐭 App 𝐭 − 𝐭𝐢𝐦𝐞
  48. 48. Keep Alive Duration request1 TCP𝐭 App Server 𝐭 − 𝐭𝐢𝐦𝐞
  49. 49. Keep Alive Duration request1 request2 TCP𝐭 App Server 𝐭 − 𝐭𝐢𝐦𝐞
  50. 50. Keep Alive Duration request1 request2 TCP request3𝐭 App Server 𝐭 − 𝐭𝐢𝐦𝐞
  51. 51. Keep Alive Duration request1 request2 TCP request3𝐭 App Server request4 𝐭 − 𝐭𝐢𝐦𝐞
  52. 52. Keep Alive Duration request1 request2 TCP request3𝐭 App Server 𝐭𝟑> 𝐝 request4 𝐭 − 𝐭𝐢𝐦𝐞 𝐝 − 𝐤𝐞𝐞𝐩 𝐚𝐥𝐢𝐯𝐞 𝐝𝐮𝐫𝐚𝐭𝐢𝐨𝐧
  53. 53. Keep Alive Duration request1 request2 TCP request3𝐭 App Server 𝐭𝟑> 𝐝 request4 TCP 𝐭 − 𝐭𝐢𝐦𝐞 𝐝 − 𝐤𝐞𝐞𝐩 𝐚𝐥𝐢𝐯𝐞 𝐝𝐮𝐫𝐚𝐭𝐢𝐨𝐧
  54. 54. Keep Alive DurationhttpClient.setKeepAliveStrategy( new ConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context){ return KEEP_ALIVE_DURATION_MILLISECONDS; } });
  55. 55. Keep Alive Duration
  56. 56. Keep Alive Durationif (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){ System.setProperty("http.keepAlive", "false");}
  57. 57. Keep Alive Durationif (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){ System.setProperty("http.keepAlive", "false");}Hе поддается настройке!(≈5 секунд)
  58. 58. try { ... InputStream is = connection.getInputStream(); // Вычитывайте все данные из InputStream’a is.close();} catch (Exception e) { try { InputStream es = connection.getErrorStream(); // Вычитывайте все данные из InputStream’a es.close(); } catch (Exception ex) { ex.printStackTrace(); }}
  59. 59. Гзипование траффика
  60. 60. Гзипование траффика...InputStream is = response.getEntity().getContent();Header contentEncoding = response.getFirstHeader("Content-Encoding");
  61. 61. Гзипование траффика...InputStream is = response.getEntity().getContent();Header contentEncoding = response.getFirstHeader("Content-Encoding");if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip"))
  62. 62. Гзипование траффика...InputStream is = response.getEntity().getContent();Header contentEncoding = response.getFirstHeader("Content-Encoding");if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { is = new GZIPInputStream(is);}...
  63. 63. Гзипование траффика...InputStream is = connection.getInputStream();String contentEncoding = connection.getContentEncoding();if ("gzip".equalsIgnoreCase(contentEncoding)) { is = new GZIPInputStream(connection.getInputStream());}...
  64. 64. Гзипование траффика
  65. 65. Гзипование траффика Не полагайтесь на Content-Length!
  66. 66. Управление куками
  67. 67. Управление кукамиSet-Cookie: name=value; expires=date; path=/; domain=.example.com
  68. 68. Управление куками...CookieStore cs = getHttpClient().getCookieStore();BasicClientCookie c = new BasicClientCookie("Mpop", cookie);c.setDomain(".mail.ru");cs.addCookie(c);...
  69. 69. Управление куками...String cookieHeader = session.getCookieHeader();сonnection.setRequestProperty("Cookie", cookieHeader);...
  70. 70. Установка куки в WebViewApplication
  71. 71. Установка куки в WebViewApplication Browser WebView WebView
  72. 72. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); WebView WebView
  73. 73. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); WebView WebView
  74. 74. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); WebView WebView
  75. 75. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); WebView //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie); WebView
  76. 76. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); WebView //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync(); WebView
  77. 77. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); WebView cookie //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync(); WebView cookie
  78. 78. Установка куки в WebViewApplication Browser CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); WebView cookie //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync(); WebView cookie
  79. 79. Защищенное соединение (https)
  80. 80. Защищенное соединение (https)Application Server CA
  81. 81. Защищенное соединение (https)Application Server CA Signs certificate
  82. 82. Защищенное соединение (https) requestApplication Server CA Signs certificate
  83. 83. Защищенное соединение (https) requestApplication Server Private key Certificate Public key CA Signs certificate
  84. 84. Защищенное соединение (https) requestApplication Server Private key Certificate Public keyChecks certificate CA Signs certificate
  85. 85. Защищенное соединение (https) requestApplication Server Private key Certificate Public key Random symmetric keyChecks certificate CA Signs certificate
  86. 86. Защищенное соединение (https) requestApplication Server Private key Certificate Public key Random symmetric key Data transferringChecks certificate CA Signs certificate
  87. 87. Варианты реализации https1. KeyChain API на платформах >= 4.0
  88. 88. Варианты реализации https1. KeyChain API на платформах >= 4.02. На платформах < 4.0 надо создавать локальное хранилище ключей
  89. 89. Варианты реализации https1. KeyChain API на платформах >= 4.02. На платформах < 4.0 надо создавать локальное хранилище ключей3. Доверять всем сертификатам
  90. 90. Https на платформа < 4.0...TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);KeyStore keyStore = KeyStore.getInstance("BKS");InputStream in = context.getResources().openRawResource(mykeystore);keyStore.load(in, "mysecret".toCharArray());in.close();tmf.init(keyStore);SSLContext sslc = SSLContext.getInstance("TLS");sslc.init(null, tmf.getTrustManagers(),new SecureRandom());...
  91. 91. Https на платформа < 4.0private SSLSocketFactory createSslSocketFactory() { SSLSocketFactory sf = null; try { KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(mykeystore); keyStore.load(in, "mysecret".toCharArray()); in.close(); sf = new SSLSocketFactory(keyStore); sf.setHostnameVerifier(STRICT_HOSTNAME_VERIFIER); } catch (Exception e) { e.printStackTrace(); } return sf;}
  92. 92. Доверять всем сертификатамprivate class DummyHostnameVerifier implements HostnameVerifier{ @Override public boolean verify(String hostname, SSLSession session) { return true; }}
  93. 93. Доверять всем сертификатамprivate class DummyTrustManager implements X509TrustManager{ @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { //empty } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { //empty } ...}
  94. 94. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  95. 95. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  96. 96. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  97. 97. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  98. 98. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  99. 99. Полезные инструменты1. StrictMode2. ConnectivityManager3. DDMS Network Traffic Tool4. Rest-client5. Wireshark
  100. 100. Полезные ссылки1. KeyChain API – http://goo.gl/ICijf2. Создание локального хранилища ключей – http://goo.gl/5Surx3. Keep Alive - http://goo.gl/9cdlz4. Минимизация расхода батареи - http://goo.gl/DML0m5. Выполнение сетевых операций - http://goo.gl/GIVIs
  101. 101. А л е к с а н д р З а це п и нразработчик, Мобильная почта/Почта a l e x a n d e r. z a t s e p i n @ m a i l . r u

×