This shows you the differences between two versions of the page.
eim:laboratoare:laborator06 [2018/03/12 19:49] dragos.niculescu [Windows] |
eim:laboratoare:laborator06 [2022/04/14 12:48] (current) dragos.niculescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 06. Comunicația prin Sockeți TCP ====== | + | ====== Laborator 06. Comunicația prin Sockeți în Android ====== |
+ | |||
===== Realizarea Conexiunii între o Mașină Fizică și Dispozitivul Mobil ===== | ===== Realizarea Conexiunii între o Mașină Fizică și Dispozitivul Mobil ===== | ||
Pentru a putea comunica prin intermediul unui socket TCP, o mașină fizică și dispozitivul mobil trebuie să se găsească în aceeași rețea, astfel încât adresele IP ale acestora să fie vizibile între ele. | Pentru a putea comunica prin intermediul unui socket TCP, o mașină fizică și dispozitivul mobil trebuie să se găsească în aceeași rețea, astfel încât adresele IP ale acestora să fie vizibile între ele. | ||
+ | === Comenzi utile === | ||
+ | * <code shell>vbox86p:/ # ip ro | ||
+ | 172.16.4.0/22 dev eth1 proto kernel scope link src 172.16.7.89 | ||
+ | 192.168.57.0/24 dev eth0 proto kernel scope link src 192.168.57.101 | ||
+ | </code> interfețele, adresele, rutele (în telefon sau emulator) | ||
+ | * <code shell>student@eg106:~$ ip ro | ||
+ | default via 172.16.7.254 dev eno1 proto dhcp metric 100 | ||
+ | 169.254.0.0/16 dev eno1 scope link metric 1000 | ||
+ | 172.16.4.0/22 dev eno1 proto kernel scope link src 172.16.7.36 metric 100 | ||
+ | 172.16.101.0/24 dev vmnet1 proto kernel scope link src 172.16.101.1 | ||
+ | 192.168.57.0/24 dev vboxnet1 proto kernel scope link src 192.168.57.1 | ||
+ | </code> interfețele, adresele, rutele (mașina de dezvoltare Linux) | ||
+ | * <code shell>netstat -rn</code> interfețele, adresele, rutele (mașina de dezvoltare OSX) | ||
+ | * <code shell>ipconfig</code> interfețele, adresele, rutele (în telefon sau emulator) | ||
==== Dispozitiv Fizic ==== | ==== Dispozitiv Fizic ==== | ||
Line 19: | Line 33: | ||
<code> | <code> | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ ./adb devices | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ ./adb devices |
List of devices attached | List of devices attached | ||
0019531d59461f device | 0019531d59461f device | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ ./adb -s 0019531d59461f shell | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ ./adb -s 0019531d59461f shell |
shell@n7000:/ $ su | shell@n7000:/ $ su | ||
su | su | ||
Line 33: | Line 47: | ||
<note important>Pe Linux, în situația în care dispozitivul mobil este detectat, fără a se indica tipul său, este necesar să se pornească serverul de ADB cu drepturi de administrator: | <note important>Pe Linux, în situația în care dispozitivul mobil este detectat, fără a se indica tipul său, este necesar să se pornească serverul de ADB cu drepturi de administrator: | ||
<code> | <code> | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ ./adb devices | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ ./adb devices |
List of devices attached | List of devices attached | ||
0019531d59461f ???????????? | 0019531d59461f ???????????? | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ sudo ./adb kill-server | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ sudo ./adb kill-server |
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ sudo ./adb start-server | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ sudo ./adb start-server |
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ sudo ./adb devices | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ sudo ./adb devices |
List of devices attached | List of devices attached | ||
0019531d59461f device | 0019531d59461f device | ||
Line 53: | Line 67: | ||
<code> | <code> | ||
- | student@eim2017:~$ sudo ifconfig usb0 | + | student@eim-lab:~$ sudo ifconfig usb0 |
usb0 Link encap:Ethernet HWaddr 32:ca:4b:1c:ff:7b | usb0 Link encap:Ethernet HWaddr 32:ca:4b:1c:ff:7b | ||
inet addr:192.168.42.170 Bcast:192.168.42.255 Mask:255.255.255.0 | inet addr:192.168.42.170 Bcast:192.168.42.255 Mask:255.255.255.0 | ||
Line 86: | Line 100: | ||
Fiecărui dispozitiv virtual Genymotion îi este alocată în mod automat o adresă IP de către serverul DHCP configurat pe mașina virtuală VirtualBox în cadrul căruia rulează. | Fiecărui dispozitiv virtual Genymotion îi este alocată în mod automat o adresă IP de către serverul DHCP configurat pe mașina virtuală VirtualBox în cadrul căruia rulează. | ||
- | + | Pentru legătura virtualbox-emulator este utilizat spațiul de adrese ''192.168.56.1/24'': | |
- | Implicit, este utilizat spațiul de adrese ''192.168.56.1/24'': | + | |
* mașina fizică (default gateway) are adresa ''192.168.56.1''; | * mașina fizică (default gateway) are adresa ''192.168.56.1''; | ||
* pentru dispozitivele virtuale sunt alocate adrese în intervalul ''192.168.56.101'' .. ''192.168.56.254''. | * pentru dispozitivele virtuale sunt alocate adrese în intervalul ''192.168.56.101'' .. ''192.168.56.254''. | ||
+ | Pentru legătura wifi a emulatorului utilizat spațiul de adrese ''172.16.4.0/22'': | ||
+ | * de fapt emulatorul este legat în bridge cu celelalte desktopuri din EG106 | ||
+ | * conectarea între masina de dezvoltare și emulator se poate face și în această subrețea (similară cu cazul real în care mașina de dezvoltare și telefonul se află în aceeași rețea locală WiFi) | ||
Configurarea spațiului de adrese care este folosit poate fi configurat prin intermediul VirtualBox, accesând //File// → //Preferences// → //Network// → //Host Only Networks// | Configurarea spațiului de adrese care este folosit poate fi configurat prin intermediul VirtualBox, accesând //File// → //Preferences// → //Network// → //Host Only Networks// | ||
Line 99: | Line 115: | ||
Adresa IP care a fost atașată fiecărui dispozitiv virtual Genymotion poate fi verificată: | Adresa IP care a fost atașată fiecărui dispozitiv virtual Genymotion poate fi verificată: | ||
* folosind comanda ''adb devices''; <code> | * folosind comanda ''adb devices''; <code> | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ ./adb devices | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ ./adb devices |
List of devices attached | List of devices attached | ||
192.168.56.101:5555 device | 192.168.56.101:5555 device | ||
Line 107: | Line 123: | ||
{{ :eim:laboratoare:laborator06:genymotion_ip_addresses.png?nolink&700 }} | {{ :eim:laboratoare:laborator06:genymotion_ip_addresses.png?nolink&700 }} | ||
- | Conectivitatea dintre mașina fizică și dispozitivul virtual poate fi verificată folosind comanda ''ping''. <code> | + | Conectivitatea dintre mașina de dezvoltare și dispozitivul virtual poate fi verificată folosind comanda ''ping''. <code> |
- | student@eim2017:~$ ping 192.168.56.101 | + | student@eim-lab:~$ ping 192.168.56.101 |
Pinging 192.168.56.101 with 32 bytes of data: | Pinging 192.168.56.101 with 32 bytes of data: | ||
Reply from 192.168.56.101: bytes=32 time<1ms TTL=64 | Reply from 192.168.56.101: bytes=32 time<1ms TTL=64 | ||
Line 133: | Line 149: | ||
* prin rularea comenzii ''adb devices'' <code> | * prin rularea comenzii ''adb devices'' <code> | ||
- | student@eim2017:/opt/android-sdk-linux/platform-tools$ ./adb devices | + | student@eim-lab:/opt/android-sdk-linux/platform-tools$ ./adb devices |
List of devices attached | List of devices attached | ||
emulator-5554 device | emulator-5554 device | ||
Line 139: | Line 155: | ||
Conectarea la consola dispozitivului virtual Android se face prin comanda: <code> | Conectarea la consola dispozitivului virtual Android se face prin comanda: <code> | ||
- | student@eim2017:~$ telnet localhost 55nr | + | student@eim-lab:~$ telnet localhost 55nr |
</code> | </code> | ||
specificându-se portul pe care rulează emulatorul. | specificându-se portul pe care rulează emulatorul. | ||
- | Este necesară și autentificarea pe dispozitivul virtual respectiv, folosind o cheie care a fost instalată odată cu acesta, a cărei locație este indicată. În acest sens, se folosește comanda ''auth'', urmată de cheia dispozitivului virtual. | + | <note important> |
+ | Este necesară și autentificarea pe dispozitivul virtual respectiv, folosind o cheie care a fost instalată odată cu acesta, a cărei locație este indicată. În acest sens, se folosește comanda ''auth'', urmată de cheia dispozitivului virtual. Cheia se află în ~/.emulator_console_auth_token | ||
+ | </note> | ||
Î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: | Î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: | ||
Line 158: | Line 176: | ||
<code> | <code> | ||
- | student@eim2017:~$ telnet localhost 5554 | + | student@eim-lab:~$ telnet localhost 5554 |
Android Console: type 'help' for a list of commands | Android Console: type 'help' for a list of commands | ||
OK | OK | ||
Line 173: | Line 191: | ||
exit | exit | ||
Connection to host lost. | Connection to host lost. | ||
- | student@eim2017:~$ | + | student@eim-lab:~$ |
</code> | </code> | ||
Line 216: | Line 234: | ||
<code java> | <code java> | ||
String hostname = "localhost"; | String hostname = "localhost"; | ||
- | int port = 2017; | + | int port = 2000; |
Socket socket = new Socket(hostname, port); | Socket socket = new Socket(hostname, port); | ||
</code> | </code> | ||
Line 303: | Line 321: | ||
- în clasa ''android.os.Handler'', dacă se dorește accesarea mai multor controale grafice (fiind necesar ca instanțierea obiectului să fie realizată tot pe firul care gestionează interfața grafică); | - în clasa ''android.os.Handler'', dacă se dorește accesarea mai multor controale grafice (fiind necesar ca instanțierea obiectului să fie realizată tot pe firul care gestionează interfața grafică); | ||
- folosind un obiect de tip [[http://developer.android.com/reference/android/os/AsyncTask.html|AsyncTask]], procesarea în rețea putând fi realizată în metoda ''doInBackground()'', iar accesul la obiectele interfeței grafice fiind acordat în metodele ''onProgressUpdate()'' (invocată în mod automat de fiecare dată când se apelează metoda ''publishProgress()'') și ''onPostExecute()''. | - folosind un obiect de tip [[http://developer.android.com/reference/android/os/AsyncTask.html|AsyncTask]], procesarea în rețea putând fi realizată în metoda ''doInBackground()'', iar accesul la obiectele interfeței grafice fiind acordat în metodele ''onProgressUpdate()'' (invocată în mod automat de fiecare dată când se apelează metoda ''publishProgress()'') și ''onPostExecute()''. | ||
+ | <code java> | ||
+ | // VARIANTA 1 | ||
+ | doInBackground{ /*** Net thread ***/ | ||
+ | socket(); | ||
+ | ... | ||
+ | socket.close(); | ||
+ | return result | ||
+ | } | ||
+ | |||
+ | onPostExecute(String result) { /*** GUI thread ***/ | ||
+ | daytimeProtocolTextView.setText(result); | ||
+ | } | ||
+ | | ||
+ | // VARIANTA 2 | ||
+ | doInBackground{ /*** Net thread ***/ | ||
+ | socket.. | ||
+ | publishProgress(line); | ||
+ | publishProgress(line); | ||
+ | ... | ||
+ | socket.close(); | ||
+ | return null; | ||
+ | } | ||
+ | |||
+ | onProgressUpdate(String... progres) { /*** GUI thread ***/ | ||
+ | welcomeMessageTextView.append(progres[0] + "\n"); | ||
+ | } | ||
+ | |||
+ | onPostExecute(Void result) {} /*** GUI thread ***/ | ||
+ | </code> | ||
{{ :eim:laboratoare:laborator06:fir_de_executie_dedicat_comunicatie_prin_retea.png?nolink&600 }} | {{ :eim:laboratoare:laborator06:fir_de_executie_dedicat_comunicatie_prin_retea.png?nolink&600 }} | ||
Line 555: | Line 602: | ||
{{ :eim:laboratoare:laborator06:02single_threaded_server.png?nolink&400 }} | {{ :eim: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ă. <note important>Atenție, trebuie folosită versiunea nc.traditional, varianta nc.openbsd poate avea switch-uri diferite. Folosiți comanda <code shell>ls -l `which nc`</code> |
+ | </note> pentru a afla varianta folosită implicit. | ||
<code> | <code> | ||
- | student@eim2017:~$ nc 192.168.56.101 2017 | + | student@eim-lab:~$ nc 172.16.7.89 2000 |
Hello, EIM Student! | Hello, EIM Student! | ||
- | student@eim2017:~$ time nc 192.168.56.101 2017 | + | student@eim-lab:~$ time nc 172.16.7.89 2000 |
Hello, EIM Student! | Hello, EIM Student! | ||
Line 566: | Line 613: | ||
user 0m0.000s | user 0m0.000s | ||
sys 0m0.000s | sys 0m0.000s | ||
+ | </code> | ||
+ | |||
+ | Există și în Android o variantă simplificată de nc, care poate fi apelată folosind busybox: | ||
+ | <code> | ||
+ | busybox nc ftp.ngc.com 21 | ||
+ | busybox nc -l -p 5000 | ||
</code> | </code> | ||
Line 659: | Line 712: | ||
**1.** În contul Github personal, să se creeze un depozit denumit 'Laborator06'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | **1.** În contul Github personal, să se creeze un depozit denumit 'Laborator06'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''README.md'', nici a fișierului ''.gitignore'' sau a a fișierului ''LICENSE''). | ||
- | **2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim2017/Laborator06|]]. | + | **2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim-lab/Laborator06|]]. |
În urma acestei operații, directorul Laborator06 va trebui să se conțină directoarele ''labtasks'', ''samples'' și ''solutions''. | În urma acestei operații, directorul Laborator06 va trebui să se conțină directoarele ''labtasks'', ''samples'' și ''solutions''. | ||
<code> | <code> | ||
- | student@eim2017:~$ git clone https://www.github.com/eim2017/Laborator06.git | + | student@eim:~$ git clone https://www.github.com/eim-lab/Laborator06.git |
</code> | </code> | ||
**3.** Să se încarce conținutul descărcat în cadrul depozitului 'Laborator06' de pe contul Github personal. <code> | **3.** Să se încarce conținutul descărcat în cadrul depozitului 'Laborator06' de pe contul Github personal. <code> | ||
- | student@eim2017:~$ cd Laborator06 | + | student@eim:~$ cd Laborator06 |
- | student@eim2017:~/Laborator06$ git remote add Laborator06_perfectstudent https://github.com/perfectstudent/Laborator06 | + | student@eim:~/Laborator06$ git remote add Laborator06_perfectstudent https://github.com/perfectstudent/Laborator06 |
- | student@eim2017:~/Laborator06$ git push Laborator06_perfectstudent master | + | student@eim:~/Laborator06$ git push Laborator06_perfectstudent master |
</code> | </code> | ||
Line 681: | Line 734: | ||
Î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''). | ||
- | {{ :eim:laboratoare:laborator06:03ftp_server_welcome_message.png?nolink&400 }} | + | {{ :eim:laboratoare:ex5_ftp_image.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 697: | Line 750: | ||
- închiderea socket-ului. | - închiderea socket-ului. | ||
- | Să se verifice mesajul afișat în momentul în care se realizează o conexiune la serverul [[ftp.ngc.com|]]. | + | Să se verifice mesajul afișat în momentul în care se realizează o conexiune la serverul [[intranet.ngcaerospace.com/|]]. |
**5.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''SingleThreadedServer'' din directorul ''labtasks''. | **5.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''SingleThreadedServer'' din directorul ''labtasks''. | ||
- | Acesta reprezintă o aplicație Android care implementează un server ce ascultă pe un port (2017, în ''Constants.SERVER_PORT'') solicitări de conexiune provenite de la clienți. | + | Acesta reprezintă o aplicație Android care implementează un server ce ascultă pe un port (2000, în ''Constants.SERVER_PORT'') solicitări de conexiune provenite de la clienți. |
Pe același fir de execuție pe care se face așteptarea, este realizată și transmiterea mesajului către client, preluat dintr-un câmp text. | Pe același fir de execuție pe care se face așteptarea, este realizată și transmiterea mesajului către client, preluat dintr-un câmp text. | ||
Line 716: | Line 769: | ||
<code> | <code> | ||
- | student@eim2017:~$ nc 192.168.56.101 2017 | + | student@eim-lab:~$ nc 172.16.7.89 2000 |
Hello, EIM Student! | Hello, EIM Student! | ||
- | student@eim2017:~$ time nc 192.168.56.101 2017 | + | student@eim-lab:~$ time nc 172.16.7.89 2000 |
Hello, EIM Student! | Hello, EIM Student! | ||
Line 743: | Line 796: | ||
<code> | <code> | ||
- | C:\Users\Student> telnet 192.168.56.101 2017 | + | C:\Users\Student> telnet 192.168.56.101 2000 |
Start Server | Start Server | ||
Connection to host lost. | Connection to host lost. | ||
- | C:\Users\Student> telnet 192.168.56.101 2017 | + | C:\Users\Student> telnet 192.168.56.101 2000 |
- | Connecting To 192.168.56.101...Could not open connection to the host, on port 2017: Connect failed | + | Connecting To 192.168.56.101...Could not open connection to the host, on port 2000: Connect failed |
</code> | </code> | ||
Line 833: | Line 886: | ||
<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'' / ''2017'', respectiv ''localhost'' / ''2017''. | + | **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'' / ''2000'', respectiv ''localhost'' / ''2000''. |
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 2017, 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 2000, serverul fiind astfel simulat pe mașina fizică. |
<code> | <code> | ||
- | student@eim:~$ ps a | while read x; do echo "$x" | nc -l 2017; done | + | student@eim:~$ ps a | while read x; do echo "$x" | nc -l 2000; 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> | <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 2017. | + | 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 2000 |
{{ :eim:laboratoare:laborator06:05client_server_communication.png?nolink&400 }} | {{ :eim:laboratoare:laborator06:05client_server_communication.png?nolink&400 }} |