Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator09 [2015/05/04 05:21] Andrei Roșu-Cojocaru |
laboratoare:laborator09 [2015/05/05 02:00] (current) Andrei Roșu-Cojocaru |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Laborator 09. Implementarea Serviciilor de Rețea în Android ====== | + | ====== Laborator 09. Implementarea Serviciilor de Rețea ====== |
| În Android, prin intermediul serviciilor, sunt puse la dispoziție funcționalități care pot fi accesate de către dispozitivele care se găsesc în aceeași rețea locală. De obicei, o astfel de abordare se folosește pentru stabilirea de conexiuni punct la punct peste care pot fi dezvoltare jocuri la care pot participa mai mulți utilizatori, aplicații de partajare a unor resurse sau pentru transmiterea de mesaje. Totodată, pot fi expuse și servicii ale unor alte dispozitive din cadrul rețelei locale cum ar fi: calculatoare, imprimante, televizoare, ceasuri inteligente, acestea putând fi astfel accesate la distanță. | În Android, prin intermediul serviciilor, sunt puse la dispoziție funcționalități care pot fi accesate de către dispozitivele care se găsesc în aceeași rețea locală. De obicei, o astfel de abordare se folosește pentru stabilirea de conexiuni punct la punct peste care pot fi dezvoltare jocuri la care pot participa mai mulți utilizatori, aplicații de partajare a unor resurse sau pentru transmiterea de mesaje. Totodată, pot fi expuse și servicii ale unor alte dispozitive din cadrul rețelei locale cum ar fi: calculatoare, imprimante, televizoare, ceasuri inteligente, acestea putând fi astfel accesate la distanță. | ||
| Line 953: | Line 953: | ||
| **4.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectul ''ChatServiceAndroidNSD'' sau ''ChatServiceJmDNS'' din directorul ''labtasks''. | **4.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectul ''ChatServiceAndroidNSD'' sau ''ChatServiceJmDNS'' din directorul ''labtasks''. | ||
| - | Pentru rularea acestui proiect vor fi necesare două dispozitive mobile care să se găsească în aceeași rețea locală. | + | **5.** Să se ruleze aplicația Android pe două dispozitive mobile care să se găsească în aceeași rețea. |
| - | Folosind Genymotion, se pot crea două imagini pentru două dispozitive mobile (virtuale) de același tip, care vor putea fi rulate separat, fiecare dintre acestea primind adrese Internet diferite din intervalul ''192.168.56.101'' → ''192.168.56.254''. | + | <note tip> |
| + | În cazul Genymotion, se pot crea două imagini pentru două dispozitive mobile (virtuale) de același tip, care vor putea fi rulate separat, fiecare dintre acestea primind adrese Internet diferite din intervalul ''192.168.56.101'' → ''192.168.56.254''. | ||
| {{ :laboratoare:laborator09:genymotion01.png?nolink&600 }} | {{ :laboratoare:laborator09:genymotion01.png?nolink&600 }} | ||
| - | Acestea vor putea rula instanțe diferite ale aplicației Android, fiecare folosind **o denumire proprie pentru serviciu** (valoarea lui ''Constants.SERVICE_NAME'' din pachetul ''ro.pub.cs.systems.pdsd.lab09.chatservice.general'' trebuie modificată astfel încât să fie unică în rețeaua locală). | + | În VirtualBox (> versiunea 4.3.26), se verifică faptul că dispozitivele virtuale comunică între ele prin intermediul unei interfețe de rețea, configurată să folosească NAT (Network Address Translation). |
| + | |||
| + | În acest sens, trebuie realizate următoarele operații: | ||
| + | |||
| + | * se va crea o rețea NAT în cadrul VirtualBox (//File// → //Preferences// sau Ctrl + G) | ||
| + | |||
| + | {{ :laboratoare:laborator09:virtualbox01.png?nolink&400 }} | ||
| + | |||
| + | {{ :laboratoare:laborator09:virtualbox02.png?nolink&400 }} | ||
| + | |||
| + | * în configurația aferentă fiecărui dispozitiv virtual (//Machine// → //Settings// sau Ctrl + S), se va selecta //NAT Network// folosind rețeaua astfel definită pentru interfața //Adapter 2// | ||
| + | |||
| + | {{ :laboratoare:laborator09:virtualbox03.png?nolink&400 }} | ||
| + | </note> | ||
| + | |||
| + | Acestea vor putea rula instanțe diferite ale aplicației Android, fiecare folosind __**o denumire proprie pentru serviciu**__ (la valoarea generică ''Constants.SERVICE_NAME'' definită în pachetul ''ro.pub.cs.systems.pdsd.lab09.chatservice.general'' se sufixează în mod automat un șir de caractere generat aleator, astfel încât aceasta să fie unică în rețeaua locală). | ||
| + | |||
| + | Se verifică faptul că fiecare aplicație Android rulează pe un dispozitiv diferit: | ||
| {{ :laboratoare:laborator09:genymotion02.png?nolink&600 }} | {{ :laboratoare:laborator09:genymotion02.png?nolink&600 }} | ||
| - | **5.** Să se încarce modificările realizate în cadrul depozitului 'Laborator09' de pe contul Github personal, folosind un mesaj sugestiv. <code> | + | În Logcat, se pot utiliza filtre diferite pentru fiecare dintre dintre instanțele aplicației Android, astfel încât să se faciliteze procesul de depanare. |
| + | |||
| + | **6.** Să se implementeze rutina pentru trimiterea mesajelor, pe metoda ''run()'' a firului de execuție ''SendThread'' din clasa ''ChatClient'' a pachetului ''ro.pub.cs.systems.pdsd.lan09.chatservice.networkservicediscoveryoperations''. | ||
| + | |||
| + | Metoda va rula cât timp firul de execuție nu este întrerupt, informație oferită de metoda ''isInterrupted()''. | ||
| + | |||
| + | <code java> | ||
| + | while (!Thread.currentThread().isInterrupted()) { | ||
| + | // ... | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Pe fiecare iterație, se vor realiza următoarele operații: | ||
| + | - se va prelua un mesaj din coada ''messageQueue'' (de tip ''BlockingQueue<String>''); metoda ''take()'' este blocantă, în așteptarea unei valori care să poată fi furnizată - astfel, în momentul în care firul de execuție este întrerupt, se va genera o excepție de tipul ''InterruptedException'' care trebuie tratată; | ||
| + | - în cazul unui mesaj nenul, sunt realizate următoarele operații: | ||
| + | - se trimite mesajul pe canalul de comunicație corespunzător (se apelează metoda ''println()'' a obiectului de tip ''PrintWriter''); | ||
| + | - se construiește un obiect de tip ''Message'', format din: | ||
| + | - conținut: valoarea propriu-zisă a mesajului (șirul de caractere); | ||
| + | - tip: mesaj transmis (''Constants.MESSAGE_TYPE_SENT''); | ||
| + | - se atașează mesajul istoricului conversației (obiectul ''conversationHistory'' este de tipul ''List<Message>'') - în acest fel, chiar dacă interfața grafică nu este vizibilă la momentul în care este trimis mesajul, conversația poate fi încărcată atunci când se întâmplă acest lucru; | ||
| + | - se afișează mesajul în fragmentul de tip ''ChatConversationFragment'' (prin intermediul metodei ''appendMessage()''), dacă acesta este asociat activității la momentul respectiv <code java> | ||
| + | if (context != null) { | ||
| + | ChatActivity chatActivity = (ChatActivity)context; | ||
| + | FragmentManager fragmentManager = chatActivity.getFragmentManager(); | ||
| + | Fragment fragment = fragmentManager.findFragmentByTag(Constants.FRAGMENT_TAG); | ||
| + | if (fragment instanceof ChatConversationFragment && fragment.isVisible()) { | ||
| + | ChatConversationFragment chatConversationFragment = (ChatConversationFragment)fragment; | ||
| + | chatConversationFragment.appendMessage(message); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | **7.** Să se implementeze rutina pentru primirea mesajelor, pe metoda ''run()'' a firului de execuție ''ReceiveThread'' din clasa ''ChatClient'' a pachetului ''ro.pub.cs.systems.pdsd.lan09.chatservice.networkservicediscoveryoperations''. | ||
| + | |||
| + | Metoda va rula cât timp firul de execuție nu este întrerupt, informație oferită de metoda ''isInterrupted()''. | ||
| + | |||
| + | <code java> | ||
| + | while (!Thread.currentThread().isInterrupted()) { | ||
| + | // ... | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Pe fiecare iterație, se vor realiza următoarele operații: | ||
| + | - se primește mesajul pe canalul de comunicație corespunzător (se apelează metoda ''readLine()'' a obiectului de tip ''BufferedReader''); | ||
| + | - în cazul unui mesaj nenul, sunt realizate următoarele operații: | ||
| + | - se construiește un obiect de tip ''Message'', format din: | ||
| + | - conținut: valoarea propriu-zisă a mesajului (șirul de caractere); | ||
| + | - tip: mesaj transmis (''Constants.MESSAGE_TYPE_RECEIVED''); | ||
| + | - se atașează mesajul istoricului conversației (obiectul ''conversationHistory'' este de tipul ''List<Message>''); | ||
| + | - se afișează mesajul în fragmentul de tip ''ChatConversationFragment'' (prin intermediul metodei ''appendMessage()''), dacă acesta este asociat activității la momentul respectiv. | ||
| + | |||
| + | **8.** Să se încarce modificările realizate în cadrul depozitului 'Laborator09' de pe contul Github personal, folosind un mesaj sugestiv. <code> | ||
| student@pdsd2015:~/Laborator09$ git add * | student@pdsd2015:~/Laborator09$ git add * | ||
| student@pdsd2015:~/Laborator09$ git commit -m "implemented taks for laboratory 09" | student@pdsd2015:~/Laborator09$ git commit -m "implemented taks for laboratory 09" | ||
