Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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:​
laboratoare/laborator06.1460072426.txt.gz · Last modified: 2017/02/20 20:44 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0