Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator06 [2016/04/08 02:40] Andrei Roșu-Cojocaru |
laboratoare:laborator06 [2017/02/20 20:54] (current) |
||
|---|---|---|---|
| Line 42: | Line 42: | ||
| 0019531d59461f device | 0019531d59461f device | ||
| </code> | </code> | ||
| + | |||
| + | Pentru dispozitivele care nu permit conectarea cu ''adb shell'' in modul tethering [[http://stackoverflow.com/questions/9210152/set-up-device-for-development-no-permissions|soluție stackoverflow]], trebuie creat în Ubuntu fișierul ''/etc/udev/rules.d/51-android.rules'' și adăugat codul obținut cu ''lsusb'' pentru fabricantul telefonului. Odată dispozitivul de rețea obținut (de exemplu ''rndis0''), se folosește ''dhclient rndis0'' pentru a obține o adresă IP de la telefon. | ||
| Pe Windows, dacă dispozitivul mobil nu este detectat, poate fi necesară instalarea unor drivere suplimentare pentru stabilirea legăturii prin intermediul portului USB. | Pe Windows, dacă dispozitivul mobil nu este detectat, poate fi necesară instalarea unor drivere suplimentare pentru stabilirea legăturii prin intermediul portului USB. | ||
| Line 107: | Line 109: | ||
| 192.168.56.101:5555 device | 192.168.56.101:5555 device | ||
| </code> | </code> | ||
| - | * prin intermediul plugin-ului Genymotion pentru mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) - Ctrl + 6. | + | * prin intermediul plugin-ului Genymotion pentru mediile integrate de dezvoltare. |
| {{ :laboratoare:laborator06:genymotion_ip_addresses.png?nolink&700 }} | {{ :laboratoare:laborator06:genymotion_ip_addresses.png?nolink&700 }} | ||
| Line 147: | Line 149: | ||
| specificându-se portul pe care rulează emulatorul. | specificându-se portul pe care rulează emulatorul. | ||
| - | În consolă, realizarea unei legături între mașina fizică și dispozitivul virtual Android se face prin [[http://developer.android.com/tools/devices/emulator.html#portredirection|redirectarea portului]], folosind comanda ''redir'', aceasta suportând mai multe opțiuni: | + | În consolă, realizarea unei legături între mașina fizică și dispozitivul virtual Android se face prin [[http://developer.android.com/tools/help/emulator.html#redirection|redirectarea portului]], folosind comanda ''redir'', aceasta suportând mai multe opțiuni: |
| * ''list''; | * ''list''; | ||
| * ''add''; | * ''add''; | ||
| Line 218: | Line 220: | ||
| <code java> | <code java> | ||
| String hostname = "localhost"; | String hostname = "localhost"; | ||
| - | int port = 2015; | + | int port = 2016; |
| Socket socket = new Socket(hostname, port); | Socket socket = new Socket(hostname, port); | ||
| </code> | </code> | ||
| Line 313: | Line 315: | ||
| Se dorește interogarea serverului National Institute of Standards & Technology, care oferă un serviciu de interogare a datei și orei curente, cu o precizie ridicată, conform [[https://tools.ietf.org/html/rfc867|Daytime Protocol (RFC-867)]]. | Se dorește interogarea serverului National Institute of Standards & Technology, care oferă un serviciu de interogare a datei și orei curente, cu o precizie ridicată, conform [[https://tools.ietf.org/html/rfc867|Daytime Protocol (RFC-867)]]. | ||
| - | {{ :laboratoare:laborator06:daytime_protocol.png?nolink&400 }} | + | {{ :laboratoare:laborator06:01day_time_protocol.png?nolink&400 }} |
| În acest sens, se va deschide un socket TCP, prin interogarea serverului disponibil la adresa [[time-b.nist.gov|]], pe portul 13, în cadrul unui fir de execuție separat (clasa ''NISTCommunicationThread''). Întrucât nu este necesară decât operația de primire a unor date, se va crea doar un obiect de tip ''BufferedReader'', citindu-se două linii (una fiind vidă - așadar ignorată, cealaltă conținând informațiile necesare, care se doresc a fi afișate). Întrucât modificarea conținutului unui control grafic nu poate fi realizată decât din contextul firului de execuție în care a fost creat, acesta va fi obținut prin parametrul metodei ''post()'' a obiectului respectiv, doar aici fiind permisă asocierea conținutului solicitat. În momentul în care datele au fost preluate, socket-ul TCP poate fi închis. Pe fiecare eveniment de tip apăsare a butonului se va crea un fir de execuție dedicat în care se va instanția un obiect de tip ''Socket''. | În acest sens, se va deschide un socket TCP, prin interogarea serverului disponibil la adresa [[time-b.nist.gov|]], pe portul 13, în cadrul unui fir de execuție separat (clasa ''NISTCommunicationThread''). Întrucât nu este necesară decât operația de primire a unor date, se va crea doar un obiect de tip ''BufferedReader'', citindu-se două linii (una fiind vidă - așadar ignorată, cealaltă conținând informațiile necesare, care se doresc a fi afișate). Întrucât modificarea conținutului unui control grafic nu poate fi realizată decât din contextul firului de execuție în care a fost creat, acesta va fi obținut prin parametrul metodei ''post()'' a obiectului respectiv, doar aici fiind permisă asocierea conținutului solicitat. În momentul în care datele au fost preluate, socket-ul TCP poate fi închis. Pe fiecare eveniment de tip apăsare a butonului se va crea un fir de execuție dedicat în care se va instanția un obiect de tip ''Socket''. | ||
| Line 555: | Line 557: | ||
| </file> | </file> | ||
| - | {{ :laboratoare:laborator06:single_threaded_server.png?nolink&400 }} | + | {{ :laboratoare:laborator06:02single_threaded_server.png?nolink&400 }} |
| Prin intermediul utilitarului ''nc'' (apelat cu adresa Internet și portul serverului) se poate interoga mesajul care a fost transmis. De asemenea, comanda ''time'' măsoară timpul în care a fost executată operația respectivă. | Prin intermediul utilitarului ''nc'' (apelat cu adresa Internet și portul serverului) se poate interoga mesajul care a fost transmis. De asemenea, comanda ''time'' măsoară timpul în care a fost executată operația respectivă. | ||
| <code> | <code> | ||
| - | student@eim2016:~$ nc 192.168.56.101 2015 | + | student@eim2016:~$ nc 192.168.56.101 2016 |
| Hello, EIM Student! | Hello, EIM Student! | ||
| - | student@eim2016:~$ time nc 192.168.56.101 2015 | + | student@eim2016:~$ time nc 192.168.56.101 2016 |
| Hello, EIM Student! | Hello, EIM Student! | ||
| Line 675: | Line 677: | ||
| </code> | </code> | ||
| - | **4.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio sau Eclipse Luna) proiectul ''FTPServerWelcomeMessage'' din directorul ''labtasks''. | + | **4.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio sau Eclipse) proiectul ''FTPServerWelcomeMessage'' din directorul ''labtasks''. |
| Se cere să se implementeze o aplicație Android care citește mesajul de întâmpinare transmis în momentul în care se realizează o conexiune către un server FTP. | Se cere să se implementeze o aplicație Android care citește mesajul de întâmpinare transmis în momentul în care se realizează o conexiune către un server FTP. | ||
| Line 683: | Line 685: | ||
| În cazul în care mesajul de întâmpinare conține mai multe linii, mesajul este precedat de șirul de caractere ''220-'' (reținut în ''Constants.FTP_MULTILINE_START_CODE''). Mesajul se încheie fie cu șirul de caractere ''220'', fie cu un șir de caractere precedat de ''220 '' (valori stocate în ''Constants.FTP_MULTILINE_END_CODE1'', respectiv ''Constants.FTP_MULTILINE_END_CODE2''). | În cazul în care mesajul de întâmpinare conține mai multe linii, mesajul este precedat de șirul de caractere ''220-'' (reținut în ''Constants.FTP_MULTILINE_START_CODE''). Mesajul se încheie fie cu șirul de caractere ''220'', fie cu un șir de caractere precedat de ''220 '' (valori stocate în ''Constants.FTP_MULTILINE_END_CODE1'', respectiv ''Constants.FTP_MULTILINE_END_CODE2''). | ||
| - | {{ :laboratoare:laborator06:ftp_server_welcome_message.png?nolink&400 }} | + | {{ :laboratoare:laborator06:03ftp_server_welcome_message.png?nolink&400 }} |
| Operațiile care trebuie realizate pe metoda ''doInBackground()'' a firului de execuție ce gestionează comunicația cu serverul FTP sunt: | Operațiile care trebuie realizate pe metoda ''doInBackground()'' a firului de execuție ce gestionează comunicația cu serverul FTP sunt: | ||
| Line 811: | Line 813: | ||
| - clientul dispune de două câmpuri text, prin care se precizează parametrii de conexiune la server (adresa de Internet / portul) precum și un buton prin intermediul căruia se realizează legătura propriu-zisă, fiind preluată informația din cadrul canalului de comunicație și afișată corespunzător. | - clientul dispune de două câmpuri text, prin care se precizează parametrii de conexiune la server (adresa de Internet / portul) precum și un buton prin intermediul căruia se realizează legătura propriu-zisă, fiind preluată informația din cadrul canalului de comunicație și afișată corespunzător. | ||
| - | {{ :laboratoare:laborator06:client_server_communication01.png?nolink&400 }} | + | {{ :laboratoare:laborator06:04client_server_communication.png?nolink&400 }} |
| **a)** Să se implementeze funcționalitatea serverului. | **a)** Să se implementeze funcționalitatea serverului. | ||
| Line 821: | Line 823: | ||
| **b)** Să se implementeze funcționalitatea clientului. | **b)** Să se implementeze funcționalitatea clientului. | ||
| - | În clasa ''ClientThread'' din fragmentul asociat serverului: | + | În clasa ''ClientAsyncTask'' din fragmentul asociat serverului: |
| - | - se resetează conținutul câmpului text ''serverMessageTextView'', astfel încât acesta să conțină șirul vid; | + | - se resetează conținutul câmpului text ''serverMessageTextView'', astfel încât acesta să conțină șirul vid; acest lucru este realizat înainte de a rula firul de execuție dedicat, așadar pe metoda ''onPreExecute()''; |
| - | - se obțin parametrii de conexiune la server (adresa de Internet, obținută din câmpul text ''serverAddressEditText'' și portul, obținut din câmpul text ''serverPortEditText''); | + | - se obțin parametrii de conexiune la server (adresa de Internet, obținută din câmpul text ''serverAddressEditText'' și portul, obținut din câmpul text ''serverPortEditText''); aceștia sunt transmiși prin intermediul argumentelor metodei ''doInBackground()''; |
| - se deschide un socket, folosind configurația precizată de utilizator; | - se deschide un socket, folosind configurația precizată de utilizator; | ||
| - se obține o referință către fluxul de intrare asociat socket-ului, prin intermediul metodei ajutătoare ''Utilities.getReader()''; | - se obține o referință către fluxul de intrare asociat socket-ului, prin intermediul metodei ajutătoare ''Utilities.getReader()''; | ||
| - | - se citesc linii din contextul canalului de comunicație, atâta timp cât nu se întâlnește ''EOF'' (nu se întoarce valoarea ''null''), valoarea fiind concatenată la câmpul text ''serverMessageTextView''; | + | - se citesc linii din contextul canalului de comunicație, atâta timp cât nu se întâlnește ''EOF'' (nu se întoarce valoarea ''null''), valoarea fiind concatenată la câmpul text ''serverMessageTextView''; acest lucru este realizat prin transmiterea liniilor către firul de execuție principal - al interfeței grafice - (unde controalele grafice sunt accesibile), prin intermediul metodei ''publishProgress()'' care determină apelul metodei de callback ''onPublishProgress()''; |
| - se închide socketul. | - se închide socketul. | ||
| Line 835: | Line 837: | ||
| Să se oprească serverul (se introduce textul //Stop Server//). Să se verifice ce valori sunt furnizate în această situație. | Să se oprească serverul (se introduce textul //Stop Server//). Să se verifice ce valori sunt furnizate în această situație. | ||
| - | **d)** (doar Linux) Să se creeze o listă cu procesele care rulează la momentul curent, textul putând fi obținut, linie cu linie, prin intermediul unei conexiuni pe portul 2015, serverul fiind astfel simulat pe mașina fizică. | + | **d)** (doar Linux) Să se creeze o listă cu procesele care rulează la momentul curent, textul putând fi obținut, linie cu linie, prin intermediul unei conexiuni pe portul 2016, serverul fiind astfel simulat pe mașina fizică. |
| <code> | <code> | ||
| student@eim2016:~$ ps a | while read x; do echo "$x" | nc -l 2016; done | student@eim2016:~$ ps a | while read x; do echo "$x" | nc -l 2016; done | ||
| </code> | </code> | ||
| + | |||
| + | <note tip>Pe mașinile Debian, comanda ''nc'' se rulează cu opțiunea suplimentară ''-p'' pentru a se indica portul pe care se dorește ca acesta să accepte invocările.</note> | ||
| Să se folosească clientul pentru a citi, linie cu linie, valorile furnizate de script-ul anterior. Va trebui precizată adresa mașinii fizice (în funcție de configurația folosită) și portul 2016. | Să se folosească clientul pentru a citi, linie cu linie, valorile furnizate de script-ul anterior. Va trebui precizată adresa mașinii fizice (în funcție de configurația folosită) și portul 2016. | ||
| - | {{ :laboratoare:laborator06:client_server_communication02.png?nolink&400 }} | + | {{ :laboratoare:laborator06:05client_server_communication.png?nolink&400 }} |
| - | **7.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectul ''04-PheasantGame'' din directorul ''labtasks''. | + | **7.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio sau Eclipse) proiectul ''PheasantGame'' din directorul ''labtasks''. |
| Acesta reprezintă o aplicație Android care implementează jocul Fazan în limba engleză, atât partea de server, cât și partea de client. | Acesta reprezintă o aplicație Android care implementează jocul Fazan în limba engleză, atât partea de server, cât și partea de client. | ||
| Line 857: | Line 861: | ||
| - altfel, se trimite înapoi cuvântul primit pentru a semnala faptul că există o problemă. | - altfel, se trimite înapoi cuvântul primit pentru a semnala faptul că există o problemă. | ||
| - | {{ :laboratoare:laborator06:pheasant_game.png?nolink&400 }} | + | {{ :laboratoare:laborator06:06pheasant_game.png?nolink&400 }} |
| Astfel, serverul va avea următoarea funcționare: | Astfel, serverul va avea următoarea funcționare: | ||
