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 01:04] 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 713: | Line 715: | ||
| Preluarea invocărilor de la clienți este realizată doar atâta timp cât serverul se află în execuție. | Preluarea invocărilor de la clienți este realizată doar atâta timp cât serverul se află în execuție. | ||
| - | === | + | ==== Linux ==== |
| - | + | ||
| - | **Linux** | + | |
| Citirea mesajelor se face cu ''nc'' care primește ca parametrii adresa Internet și portul serverului de pe dispozitivul Android. Prin utilitarul ''time'' se verifică durata operației respective. | Citirea mesajelor se face cu ''nc'' care primește ca parametrii adresa Internet și portul serverului de pe dispozitivul Android. Prin utilitarul ''time'' se verifică durata operației respective. | ||
| <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 730: | Line 730: | ||
| </code> | </code> | ||
| - | **Windows** | + | ==== Windows ==== |
| Citirea mesajelor se face cu ''telnet'' care primește ca parametrii adresa Internet și portul serverului de pe dispozitivul Android. | Citirea mesajelor se face cu ''telnet'' care primește ca parametrii adresa Internet și portul serverului de pe dispozitivul Android. | ||
| Line 747: | Line 747: | ||
| <code> | <code> | ||
| - | C:\Users\Student> telnet 192.168.56.101 2015 | + | C:\Users\Student> telnet 192.168.56.101 2016 |
| Start Server | Start Server | ||
| Connection to host lost. | Connection to host lost. | ||
| - | C:\Users\Student> telnet 192.168.56.101 2015 | + | C:\Users\Student> telnet 192.168.56.101 2016 |
| - | Connecting To 192.168.56.101...Could not open connection to the host, on port 2015: Connect failed | + | Connecting To 192.168.56.101...Could not open connection to the host, on port 2016: Connect failed |
| </code> | </code> | ||
| - | === | + | ===== ===== |
| **a)** Să se trimită aplicația Android în fundal prin apăsarea tastei //Home//. Verificați conectivitatea cu serverul. De ce sunt tratate cererile în continuare? | **a)** Să se trimită aplicația Android în fundal prin apăsarea tastei //Home//. Verificați conectivitatea cu serverul. De ce sunt tratate cererile în continuare? | ||
| Line 780: | Line 780: | ||
| public void onDestroy() { | public void onDestroy() { | ||
| super.onDestroy(); | super.onDestroy(); | ||
| - | serverThread.stopServer(); | + | if (serverThread != null) { |
| + | serverThread.stopServer(); | ||
| + | } | ||
| } | } | ||
| </code> | </code> | ||
| Line 801: | Line 803: | ||
| **d)** Să se implementeze comunicația pentru fiecare conexiune dintre client și server pe un fir de execuție separat, astfel încât pe server, gestiunea solicitărilor provenite de la clienți să nu fie afectată. | **d)** Să se implementeze comunicația pentru fiecare conexiune dintre client și server pe un fir de execuție separat, astfel încât pe server, gestiunea solicitărilor provenite de la clienți să nu fie afectată. | ||
| - | **6.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectul ''03-ClientServerCommunication'' din directorul ''labtasks''. | + | **6.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio sau Eclipse) proiectul ''ClientServerCommunication'' din directorul ''labtasks''. |
| Acesta reprezintă o aplicație Android având două fragmente, implementând atât un server cât și un client: | Acesta reprezintă o aplicație Android având două fragmente, implementând atât un server cât și un client: | ||
| 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. | ||
| <note important>Accesul la controalele grafice trebuie să fie realizat numai din contextul firului de execuție asociat interfeței cu utilizatorul.</note> | <note important>Accesul la controalele grafice trebuie să fie realizat numai din contextul firului de execuție asociat interfeței cu utilizatorul.</note> | ||
| - | **c)** Să se pornească serverul (se introduce textul //Start Server//). În client, să se verifice valoarea furnizată în cazul în care se introduc valorile ''127.0.0.1'' / ''2015'', respectiv ''localhost'' / ''2015''. | + | **c)** Să se pornească serverul (se introduce textul //Start Server//). În client, să se verifice valoarea furnizată în cazul în care se introduc valorile ''127.0.0.1'' / ''2016'', respectiv ''localhost'' / ''2016''. |
| 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 2015; done | + | student@eim2016:~$ ps a | while read x; do echo "$x" | nc -l 2016; done |
| </code> | </code> | ||
| - | 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 2015. | + | <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. | ||
| - | {{ :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: | ||
