4. alkalom – Hálózat Kezelés Android tanfolyam 4. alkalom – Hálózat Kezelés
Alapok – DNS/IP DNS Hierechikus fa. Hálózatba kötött gépekhez rendel szöveges azonosítót. IP IPv4: 152.66.208.63 IPv6: 2001:738:2001:2078:0:208:88:0 url: https://trash.sch.bme.hu:8080
Alapok – UDP 1/2 0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Forrás | Cél | | Port | Port | | |Ellenőrző összeg | | Hossz | | | | | Adat … | +-----------------------------------+
Alapok – UDP 2/2 Tulajdonságai: Port alapú (0-65535) Nincs garantált csomag kézbesítés! Gyors. (Nincs protokoll overhead) Gyakorlati példa: Média lejátszás hálózaton keresztül (YouTube) telnet ICMP
Alapok – TCP 1/3 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | | Sequence Number | | Acknowledgment Number | | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | | Checksum | Urgent Pointer | | Options | Padding | | data |
Alapok – TCP 2/3 Tulajdonságai: Port alapú (0-65535) Biztosítja a csomag megérkezését. Összerakja a csomagot. Az UDP-nél lassabb. Minden elküldött csomagot n-szer újra küld ha nem érkezik rá válasz. Gyakorlati alkalmazás: HTTP(S) / SSH /LDAP / DNS (Ez lehet UDP is) /STB
Alapok – TCP 3/3
Java példa program (kliens) //kapcsolat felépítése: try { socketClient = new Socket(ip, 8180); sout = new PrintWriter(socketClient.getOutputStream(), true); sin = new BufferedReader(new InputStreamReader(socketClient.getInputStream())); } catch (Exception e) { // TODO: Exception Handling } //Üzenet küldése: sout.println(”Hello World!”); //Kapcsolat lezárása // TODO: Connection close.
Java példa program (szerver) //szerveren prot nyitás: try { server = new ServerSocket(8180); socketClient = server.accept(); sout = new PrintWriter(socketClient.getOutputStream(), true); sin = new BufferedReader(new InputStreamReader(socketClient.getInputStream())); } catch (Exception e) { // TODO: Exception Handling } // Üzenet fogadása: s = sin.readLine(); System.out.println(s); //Kapcsolat lezárása // TODO: Connection close.
Egy kis kitérés, szál kezelés Az Android nem engedi futni a programot, ha hálózati kommunikáció van a fő szálban! Két megoldás: Runnable (Java) Leszármaztatunk a Runnable osztályból A .run metódust definiáljuk felül A szálat a .start() metódussal indítjuk nem a run()-nal! AsyncTask (Android) Leszármaztatunk az AsyncTask<Params,Progress,Resoult> osztályból A doInBackground(Params…) metódust felül kell definiálnunk hogy menjen Hamarosan lesz róla több szó…
Java példa Szál indítására Thread t=new Thread(new Runnable() { public void run() while(true) System.out.printl(”Ezt addig írom ki, amíg le nem lösz!”) } }); t.start();
UI Thread blokkolása Nem szerencsés User-t zavarja Rendszer kilőheti az appot (ANR) Hálózati kommunikáció nem megengedett Többféle megoldás Runnable – runOnUIThread AsyncTask
AsyncTask Automatikusan kezeli a szálváltást Saját osztályt kell belőle származtatni Meg van a saját életciklusa doInBackground Háttérben fut OnPostExecute UI Thread-en fut
AsyncTask private class SendTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... texts) { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(SERVER_ADDRESS); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("text", texts[0])); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse response = httpClient.execute(httpPost); } catch (Exception e) { e.printStackTrace(); } return null; Futtatás: new SendTask().execute(new String[] { param });
HTTP kommunikáció Androidon HttpClient-en keresztűl HttpPost/HttpGet objektum használatával HttpClient execute metódusának meghívása
HttpPost HttpClient httpClient = new DefaultHttpClient(); try { List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("text", texts[0])); httpPost.setEntity(new UrlEncodedFormEntity(params)); HttpResponse response = httpClient.execute(httpPost); } catch (Exception e) { e.printStackTrace(); }