ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Σχετικά έγγραφα
Ειδικά Θέματα Προγραμματισμού

{ πρωτόκολλο, τοπική-διεύθυνση, τοπική-διεργασία, απομακρυσμένη-διεύθυνση, απομακρυσμένη-διεργασία }

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Διδάσκων: Παναγιώτης Ανδρέου

ιαδικτυακές Εφαρµογές

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

Σύντομη παρουσίαση των εργαλείων/εντολών telnet, ping, traceroute nslookup και nmap, zenmap

(C) 2010 Pearson Education, Inc. All rights reserved.

ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java

Πρωτόκολλα Διαδικτύου

ικτύωσησε Java Κατανεµηµένα Συστήµατα 08-1

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

Πρωτόκολλα Επικοινωνίας και Τείχος Προστασίας

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Επικοινωνία Client/Server Απομακρυσμένη Κλήση Διαδικασιών

Κεφάλαιο 7.3. Πρωτόκολλο TCP

Ως Διαδίκτυο (Internet) ορίζεται το παγκόσμιο (διεθνές) δίκτυο ηλεκτρονικών υπολογιστών (international network).

Αναπαραγωγή και stop/pause έτοιμων ηχητικών clips

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

Με λίγα λόγια, το TCP/IP καθορίζει τον τρόπο που πακετάρονται και μεταφέρονται τα δεδομένα της σύνδεσής μας.

Αντικειμενοστρεφής Προγραμματισμός

Γενικά (για τις γραπτές εξετάσεις)

Γενικές Αρχές. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Πρωτόκολλα Διαδικτύου

Τετράδια Κιθάρας. Χρήση του PowerTab

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Επίπεδο Μεταφοράς. (ανεβαίνουμε προς τα πάνω) Εργαστήριο Δικτύων Υπολογιστών Τμήμα Μηχανικών Η/Υ και Πληροφορικής

ΜΕΤΑΦΟΡΑ ΑΡΧΕΙΩΝ FTP

Web and HTTP. Βασικά Συστατικά: Web Server Web Browser HTTP Protocol

ΚΟΙΝΩΝΙΚΗ ΔΙΚΤΥΩΣΗ ΜΕΣΩ ΚΙΝΗΤΩΝ ΣΥΣΚΕΥΩΝ: ΧΡΗΣΗ ΔΕΚΤΗ GPS ΓΙΑ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΗΣ ΚΟΙΝΩΝΙΚΗΣ ΔΙΚΤΥΩΣΗΣ ΣΕ ΚΙΝΗΤΗ ΣΥΣΚΕΥΗ

Αρχές Δικτύων Επικοινωνιών. Επικοινωνίες Δεδομένων Μάθημα 4 ο

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

άσκηση Hide UI Elements 7.2 Try and Catch

ΤΕΙ ΚΑΒΑΛΑΣ. Πτυχιακή εργασία ΕΙΣΑΓΩΓΗ. Μιλτιάδης Κακλαμάνης

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Αντικειµενοστρεφής Προγραµµατισµός

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Α2. Να γράψετε τους αριθμούς 1-5 από τη Στήλη Α και δίπλα το γράμμα της Στήλης Β που δίνει τη σωστή αντιστοίχηση.

Κατανεμημένα Συστήματα

Κέντρο υποστήριξης HP. Εισαγωγή. Τι χρειάζεται να γνωρίζετε. Λήψη και εγκατάσταση της λύσης Vista στα Windows 8. 1 of 5 1/7/2014 2:09 μμ

WiFi V-Timer ΕΚΔΟΣΗ 2Η

Κατανεμημένα Συστήματα

Οδηγίες αξιοποίησης για τον Εκπαιδευτικό

ΕΠΙΚΟΙΝΩΝΙΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΕΣ INTERNET

7.2.2 Σχέση OSI και TCP/IP

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Διαχείριση Ειδοποιήσεων με Κινητές Συσκευές

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Κεφάλαιο 7 Διαδικτύωση-Internet. 7.2 Τεχνολογία TCP/IP

Οδηγός γρήγορης εγκατάστασης. (Για Windows και MAC) Ασύρματη κάμερα IP HD περιστροφής / κλισης για εσωτερικούς χώρους v3.14

Πρότυπο Αναφοράς Open Systems Interconnection (OSI) Επικοινωνίες Δεδομένων Μάθημα 5 ο

Ειδικά Θέματα Προγραμματισμού

Κατανεμημένα Συστήματα. Javascript LCR example

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Interfox.gr. Κωδικοποίηση Κάμερας

Δημιουργία μιας εφαρμογής Java με το NetBeans

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

HY335 4ο Φροντιστήριο

Εισαγωγή στον Κατανεμημένο Προγραμματισμό

Δίκτυα Υπολογιστών. Δίκτυα υπολογιστών και το Διαδίκτυο Εισαγωγή. Κ. Βασιλάκης

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

SNMP ΔΙΑΧΕΙΡΙΣΗ ΔΙΚΤΥΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ ΓΙΑ ΤΟΝ ΕΛΕΓΧΟ ΤΩΝ HX-GO02 & HX-GO1

ΥΛΟΠΟΙΗΣΗ ΠΡΟΤΥΠΩΝ ΕΠΙΚΟΙΝΩΝΙΑΣ ΜΕ ΤΗ ΒΙΒΛΙΟΘΗΚΗ JAVA.NET ΣΤΑ ΠΛΑΙΣΙΑ ΤΟΥ ΜΑΘΗΜΑΤΟΣ ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΥ ΚΥΚΛΟΥ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΟΥ ΤΕΕ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

2.1 Αντικειµενοστρεφής προγραµµατισµός

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Εφαρμογές Σειριακής Επικοινωνίας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ANDROID Προγραμματισμός Εφαρμογών

Πρωτόκολλα Διαδικτύου Μέρος 2ο. Επικοινωνίες Δεδομένων Μάθημα 3 ο

Λειτουργικά Συστήματα

Ethernet Ethernet ΙΕΕΕ CSMA/CD

//στο pin 3 του μικροελεγκτή συνδέουμε το control pin του ρελέ. WRITE 'I am on' στο SOCKET // λέω στον client ότι άναψα τη λάμπα

Λειτουργικά Συστήματα (Λ/Σ)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Προγραμματισμός με BSD Sockets σε περιβάλλον Linux

Εισαγωγή στον Προγραμματισμό

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Οδηγός Εγκατάστασης και Χρήσης του Arebas Easy

Τι είναι το πρωτόκολλο Διαδικτύου (Internet Protocol, IP);

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΡΟΣΟΜΟΙΩΣΗ ΔΙΕΡΓΑΣΙΩΝ ΧΡΗΣΙΜΟΠΟΙΩΝΤΑΣ ΤΟ ΛΟΓΙΣΜΙΚΟ EXTEND. 1 ο εργαστήριο Διοίκησης και Παραγωγής Έργων

Εξοικείωση με τις εντολές ipconfig και ping

Εργασία για το Facility Game Μάθημα: Δομές Δεδομένων Σωτήρης Γυφτόπουλος

Βασικές Υπηρεσίες Διαδικτύου. Επικοινωνίες Δεδομένων Μάθημα 2 ο

Δομές Δεδομένων. Σημειώσεις από το εργαστήριο για τον χειρισμό του προγράμματος Eclipse. 5ο εξάμηνο. v1.0

Διαχείριση Πληροφοριών στο Διαδίκτυο. Εργαστήριο 1

Κλάσεις και Αντικείµενα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ CD-PLUS/4+N

1ο Φύλλο Εργασίας. της παλέτας Ήχος. Πώς μπορούμε να εισάγουμε και να αναπαράγουμε έναν ήχο;

7.11 Πρωτόκολλα Εφαρµογής Βασικές και Προηγµένες Υπηρεσίες ιαδικτύου. Ηλεκτρονικό Ταχυδροµείο. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

Βιντεοπροβολέας δικτύου - Οδηγός χρήσης

Ενότητα 1η. Εισαγωγή στην Πληροφορική

Λιβανός Γιώργος Εξάμηνο 2017Β

Προετοιμασία σύνδεσης του modem. Εγκατάσταση του Modem

Αυτόνομοι Πράκτορες. ΝΑΟ Μουσικός

Transcript:

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΤΥΧΙΑΚΗ / ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ «ΔΙΑΔΙΚΤΥΑΚΑ ΠΡΩΤΟΚΟΛΛΑ ΚΑΙ ΔΙΕΠΑΦΕΣ ΓΙΑ ΣΥΓΚΕΡΑΣΜΕΝΕΣ ΚΑΙ ΜΙΚΡΟΤΟΝΙΚΕΣ ΚΛΙΜΑΚΕΣ ΣΕ ΦΟΡΗΤΕΣ ΣΥΣΚΕΥΕΣ» Internet Protocols and Interfaces for Tempered and Microtonic Scales in Mobile Devices Καζδαρίδης Γεώργιος Λειβαδίτης Αναστάσιος ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ: Πολίτης Διονύσιος Θεσσαλονίκη, Ιούνιος 2015

ii

ΠΕΡΙΛΗΨΗ Η πτυχιακή αυτή εργασία ασχολείται με ένα πακέτο εφαρμογών σε περιβάλλοντα Windows για ηλεκτρονικούς υπολογιστές και Android για φορητές συσκευές. Πιο συγκεκριμένα, οι εφαρμογές αυτές είναι εξομοιωτές synthesizer, που τα συστήματα στα οποία είναι εγκατεστημένα μπορούν να επικοινωνούν ασύρματα μέσω WIFI δικτύων με χρήση Java Sockets. Επίσης, στις εφαρμογές συγκαταλέγονται διεπαφές που παρέχουν στον μουσικό/ερευνητή τη δυνατότητα παραγωγής μουσικής μικροτονικών και μη κλιμάκων. Αυτό γίνεται με τη βοήθεια παραδοσιακών οργάνων όπως η Ποντιακή Λύρα και το Σάζι. Επίσης, στη κατάλληλη διεπαφή ο χρήστης μπορεί να παράγει βυζαντινή μουσική με τρόπο ακριβή και όμοιο με αυτόν που παράγεται από τον ίδιο τον άνθρωπο. iii

ABSTRACT This thesis deals with a bunch of software applications, which are compatible with Windows for use on PCs and Android for use on mobile devices. More specifically, the applications created are synthesizer simulators, which give the ability to the systems that they are installed to communicate wirelessly via Wifi. Moreover, those applications include interfaces that give the musician/scientist the ability to produce music using microtonical and tempered scales. This is possible with the help of the traditional Greek instruments of Pontian Lyra and Sazi. Also, at a certain interface users can produce Byzantine music in a precise and similar way to the one human do it. iv

ΕΥΧΑΡΙΣΤΙΕΣ Ολοκληρώνοντας τις προπτυχιακές σπουδές μας παράλληλα με την παρούσα διπλωματική εργασία, θα θέλαμε πρώτα από όλους να ευχαριστήσουμε θερμά τους γονείς μας. Η αμέριστη υποστήριξη, συμπαράσταση και καθοδήγηση που μας προσέφεραν ήταν και είναι καθοριστική για την ορθή εξέλιξη της πορείας μας ακαδημαϊκά, αλλά και ως μέλη της κοινωνίας. Αμέριστη ήταν επίσης η στήριξη του επιβλέποντος της εργασίας μας, Επίκουρου Καθηγητή κ. Πολίτη Διονύσιου, τον οποίο οφείλουμε να ευχαριστήσουμε θερμά. Η συνεργασία μας υπήρξε υποδειγματική καθότι, εκτός από ένας εξαίρετος επιστήμονας, είναι και ένας θαυμάσιος χαρακτήρας ο οποίος ενδιαφέρεται για κάθε φοιτητή και την πρόοδό του. Τέλος ευχαριστούμε τους φίλους, συμφοιτητές και καθηγητές μας, για την βοήθεια και τις γνώσεις που μας προσέφεραν όλα αυτά τα χρόνια. Καζδαρίδης Γεώργιος - Λειβαδίτης Αναστάσιος 2015 v

ΠΕΡΙΕΧΟΜΕΝΑ Περίληψη... iii Abstract... iv ΚΕΦΑΛΑΙΟ 1... 8 Εισαγωγή... 8 1.1 Στόχος της διατριβής... 8 1.2 Δομή της πτυχιακής... 9 ΚΕΦΑΛΑΙΟ 2... 11 Sockets... 11 2.1 Η έννοια των Sockets(υποδοχές)... 11 2.2 Προγραμματισμός για TCP Sockets... 11 2.3 Oρισμός Socket... 12 2.3.1 Περιγραφή... 12 2.3.2 Λειτουργία... 13 2.3.2.1 Το μοντέλο client-server... 14 2.3.2.2 Παράδειγμα TCP Socket: Ανάπτυξη Client - Server εφαρμογής με TCP sockets... 15 2.3.2.3 O πελάτης ( client )... 15 2.3.2.4Ο εξυπηρετητής ( server )... 20 2.3.2.5 Κατασκευαστές και μέθοδοι κλάσης Socket... 25 2.3.2.6Κατασκευαστές και Μέθοδοι της κλάσης ServerSocket... 27 2.4Σύνοψη-Συμπεράσματα... 28 ΚΕΦΑΛΑΙΟ 3... 29 Οι εφαρμογές... 29 3.1 Το πακέτο εφαρμογών μας... 29 3.2 Το Interface... 29 3.2.1 Piano Server... 32 3.2.2 Piano Client... 33 3.3.1 Οι δύο εφαρμογές σε αλληλεπίδραση... 34 3.3.2 Πεδίο Chat... 35 3.4 Επικοινωνία Server-Client... 36 vi

3.5 Η εφαρμογή για Android συσκευές... 37 3.5.1 Piano Client(Android)... 38 3.5.2 Το Interface του app... 38 3.6 Ένα χαρακτηριστικό παράδειγμα εφαρμογής του πακέτου μας... 39 ΚΕΦΑΛΑΙΟ 4... 42 Μικροτονική, Βυζαντινή Μουσική, Παραδοσιακά όργανα... 42 4.1 Κλίμακα... 42 4.2 Μικροτονική... 44 4.2.1 Βυζαντινή Μουσική... 44 4.2.2 Λύρα και Σάζι... 46 4.2.3 Η σχέση Λύρας-Σαζίου με την Βυζαντινή Μουσική... 47 Κεφάλαιο 5ο... 48 5.1 Γνωριμία με τις νέες διεπαφές του πακέτου εφαρμογών μας... 48 5.2 Διεπαφή «Παραδοσιακά Όργανα»... 50 5.2.1 Δύο διέσεις... 50 5.2.2 Τρεις διέσεις... 51 5.2.3 Τέσσερις διέσεις... 52 5.2.4 Πέντε διέσεις... 53 5.3 Διεπαφή «Βυζαντινή Μουσική»... 54 ΚΕΦΑΛΑΙΟ 6... 58 Σύνοψη... 58 6.1 Σύνοψη και αποτελέσματα... 58 6.2 Μελλοντική έρευνα... 59 Βιβλιογραφία... 53 vii

ΚΕΦΑΛΑΙΟ 1 Εισαγωγή 1.1 Στόχος της διατριβής Τα τελευταία χρόνια, η ραγδαία ανάπτυξη της τεχνολογίας συνέβαλε σημαντικά στην εξάπλωση των προϊόντων της στις σύγχρονες κοινωνίες, αφού αυτά έγιναν πιο προσιτά και πιο εύχρηστα. Η αγορά κατακλύστηκε από ηλεκτρονικούς υπολογιστές και φορητές συσκευές(κινητά και ταμπλέτες), αφού αυτά προσέφεραν την δυνατότητα παροχής λύσεων και κάλυψης αναγκών του ανθρώπου. Ανεπηρέαστος από την εξάπλωση αυτή δε θα μπορούσε να μείνει ο τομέας της μουσικής, που πλέον μέσω των εφαρμογών βρήκε λύσεις σε προβλήματα που χρόνια ταλανίζουν τους μουσικούς και τους ερευνητές της μουσικής. Ένα από αυτά ήταν η σύνδεση των μουσικών συσκευών μεταξύ τους, όπως το synthesizer, ή η σύνδεση τους με ηλεκτρονικούς υπολογιστές που πλέον θα μπορούσαν να δώσουν τεράστιες δυνατότητες λήψης και επεξεργασίας του ήχου. Τα πρότυπα σύνδεσης που χρησιμοποιούνταν παλιότερα κατά κόρον(π.χ. καλώδιο MIDI) κρίνονται πλέον ως παρωχημένα και υπήρχε η ανάγκη για εύρεση μιας πιο σύγχρονης και αποδοτικής εναλλακτικής σύνδεσης. Η εργασία αυτή είχε ως στόχο την ανάπτυξη ενός πακέτου τριών εφαρμογών εξομοιωτών synthesizer, που θα συνδέονταν και θα επικοινωνούσαν μεταξύ τους μέσω ενός ασύρματου δικτύου Wifi, με την υλοποίηση αυτή να γίνεται με την χρήση TCP Sockets που αναπτύχθηκαν σε γλώσσα Java και βασίστηκε στο γνωστό μοντέλο Client-Server. Οι τρεις συσκευές θα έπρεπε να μπορούν να λειτουργούν ταυτόχρονα, δηλαδή να παίζει ο χρήστης σε αυτές το όργανο το οποίο είχε επιλέξει. Κάθε συσκευή 8

θα έπρεπε να αναπαράγει τον ήχο από τα πλήκτρα της που πατάει ο χρήστης κάθε στιγμή, αλλά επίσης ταυτόχρονα και του ήχους από τα πλήκτρα που πατιούνται στις άλλες δύο συσκευές. Επιπλέον, οι άλλες δύο συσκευές θα έπρεπε να λειτουργούν και να αναπαράγουν ήχο ακόμη και από διαφορετικό όργανο από την πρώτη συσκευή. Ακόμη, η εργασία κλήθηκε να δώσει μια λύση στο πρόβλημα της ανεπάρκειας των συσκευών που υπήρχαν ώστε να αποδώσουν σωστά τους ήχους μικροτονικής, αφού όσες προσπάθειες έγιναν κρίθηκαν όχι ιδιαίτερα επιτυχημένες, κυρίως λόγω δυσχρηστίας των συσκευών από τον χρήστη και του όγκου τους, καθώς ήταν ιδιαίτερα μεγάλες. Έτσι, προσπαθήσαμε να δημιουργήσουμε ένα εύχρηστο περιβάλλον ώστε να μπορεί κάποια να έρθει σε επαφή και να παίξει σε μικροτονικές κλίμακες, με χρήση 2 παραδοσιακών οργάνων, της Ποντιακής Λύρας και του Σαζίου. Τέλος, υλοποιήσαμε μια εφαρμογή όπου ο χρήστης μπορεί να παράγει Βυζαντινή μουσική με τρόπο αποδοτικά και εύκολα. 1.2 Δομή της πτυχιακής Η πορεία του κειμένου οργανώνεται στα επόμενα πέντε κεφάλαια. Το πρώτο κεφάλαιο αποτελεί την εισαγωγή, ενώ μετά το πέρας του τελευταίου κεφαλαίου αναγράφονται οι αναφορές. Το δεύτερο κεφάλαιο περιγράφει τα Sockets, από την δημιουργία της έννοιας ως τις σημερινές μορφές τους και τις εφαρμογές που αυτά βρίσκουν. Επίσης, ερχόμαστε σε επαφή με το γνωστό μοντέλο πελάτη-εξυπηρετητή και βλέπουμε πως αυτό ενσωματώνεται στην δημιουργία των Java Sockets. Το τρίτο κεφάλαιο μας «συστήνει» την εφαρμογή την οποία δημιουργήσαμε. Βλέπουμε αναλυτικά τι περιλαμβάνει το οπτικό περιβάλλον της, το κομμάτι της λειτουργικότητάς της και και επεξηγούμε τους λόγους για τις επιλογές που κάναμε όταν την προγραμματίζαμε. Επιπρόσθετα, δίνουμε και ένα παράδειγμα εφαρμογής του πακέτου εφαρμογών μας, που καταδεικνύει το πόσο καινοτόμα και χρήσιμη μπορεί να είναι. Στο τέταρτο κεφάλαιο ορίζουμε και αναλύουμε μουσικές έννοιες όπως η Μικροτονική, η Βυζαντινή μουσική. Παράλληλα, ερχόμαστε σε επαφή με 2 παραδοσιακά όργανα, την Ποντιακή Λύρα και το Σάζι, και πάμε ένα ταξίδι στην ιστορία γνωρίζοντας την εξέλιξή τους. Το πέμπτο κεφάλαιο αναφέρεται εξολοκλήρου στο σχεδιασμό και την κατασκευή των διεπαφών παραγωγής Βυζαντινής Μουσικής και μουσικλης σε Μικροτονική με Λύρα και Σάζι. Όπως και στις προηγούμενες εφαρμογές, θα μιλήσουμε για το οπτικό περιβάλλον, την λειτουργία και τον προγραμματιστικό σχεδιασμό τους. 9

Το έκτο και τελευταίο κεφάλαιο αποτελεί μια σύνοψη των προηγούμενων ζητημάτων και συνεισφορών. Η εργασία αυτή κλείνει με την παράθεση μερικών ιδεών και θεμάτων, πάνω στα οποία πιθανώς να επικεντρωθεί το μελλοντικό ερευνητικό έργο πάνω στο ήδη υπάρχον πακέτο εφαρμογών. 10

ΚΕΦΑΛΑΙΟ 2 Sockets 2.1 Η έννοια των Sockets(υποδοχές) Τα sockets είναι μια έννοια που αρχικά πρωτοεμφανίστηκε στα λειτουργικά συστήματα UNIX. Το σύστημα εισόδου εξόδου (input/output) των socket στηρίζεται στις ακόλουθες διεργασίες: Open: Άνοιγμα αρχείου Read/Write: διάβασμα από ή εγγραφή στο αρχείο Close: κλείσιμο αρχείου Αυτές οι έννοιες επεκτάθηκαν τα τελευταία χρόνια τόσο στην επικοινωνία με χρήση φορητών συσκευών, όσο και στην επικοινωνία μεταξύ διεργασιών (inter-process communication). Τα so-ckets δηλαδή είναι μέρος του διαύλου επικοινωνίας (communi-cation channel) μεταξύ 2 διεργασιών. Τι είναι όμως τα socket? Ως υποδοχή(socket) ορίζουμε το κάθε τελικό σημείο (endpoint) ενός αμφίδρομου διαύλου επικοινωνίας ( two-way communication link) μεταξύ 2 διεργασιών που ε-εκτελούνται στο δίκτυο. Ταυτοποιείται δε από το συνδυασμό μιας IP διεύθυνσης και ενός αριθμού θύρας (port number). 2.2 Προγραμματισμός για TCP Sockets To στρώμα μεταφοράς αντιπροσωπεύεται στο Internet από τα πρωτόκολλα TCP (connection oriented) και UDP (connectionless, δηλ. με datagrams). Βάση λοιπόν κάθε δικτυακής εφαρμογής είναι το πώς χειριζόμαστε τα δύο αυτά πρωτόκολλα προγραμματιστικά μέσα στα τερματικά συστήματα. Η απάντηση εγκλείεται στη έννοια των sockets. Ένα socket (υποδοχή, πρίζα ) είναι μία οντότητα (αντικείμενο 11

στην περίπτωση της Java) μέσω της οποίας το δικό μας πρόγραμμα ανταλλάσσει δεδομένα με τον δίαυλο επικοινωνίας. Προγραμματιστικά δεν έχουμε παρά να διαβάζουμε από εκεί την ροή εισόδου στο σύστημά μας και αντίστροφα να γράφουμε εκεί την ροή εξόδου από το σύστημά μας. Ιδιαίτερα στην Java, υπάρχει πρόνοια οι δύο αυτές διαδικασίες να μην διαφέρουν από το γράψιμο / διάβασμα σε / από ένα αρχείο. Στην περίπτωση πολλών συνδέσεων TCP (πάντα αμφίδρομων), πρέπει σε κάθε μία να αντιστοιχείται στο δικό της socket. Για κάθε νέα επικοινωνιακή (TCP) σύνδεση δημιουργείται ένα socket. Η εξαφάνιση της σύνδεσης συνεπάγεται την εξαφάνιση του socket και το αντίστροφο. Όλα τα sockets τα οποία χειρίζεται μία συγκεκριμένη διαδικασία (η δική μας, ή μια από τις γνωστές εφαρμογές στο διαδίκτυο) έχουν βεβαίως το δικό τους όνομα για να ξεχωρίζονται προγραμματιστικά, αλλά είναι και το καθένα συνδεδεμένο στην άκρη μίας σύνδεσης προς την εφαρμογή που εξυπηρετείται. Η άκρη αυτή αναγνωρίζεται με έναν απλό αριθμό, το port no ή τον αρ. θύρας. Αρχίζοντας από το δικό μας socket (συγκεκριμένο αντικείμενο), μπορούμε νοητικά (πρακτικά γίνεται αυτόματα) να βρούμε τον αριθμό της αντίστοιχης σύνδεσης TCP (τον οποίο φέρουν όλα τα πακέτα του πρωτοκόλλου αυτού), να καταλήξομε στο άκρο του συνομιλητή μας και να βρούμε μέσα σε αυτόν το δικό του socket (συγκεκριμένο αντικείμενο), καθώς και το port no που αυτό εξυπηρετεί. Έτσι κατορθώνεται να συνεννοούνται το δικό μας με το δικό του πρόγραμμα. 2.3 Oρισμός Socket Socket είναι το ένα άκρο, από έναν επικοινωνιακό δίαυλο διπλής κατεύθυνσης, μεταξύ δύο προγραμμάτων που εκτελούνται στο δίκτυο. Περιλαμβάνει το πρωτόκολλο, την διεύθυνση και τον αριθμό θύρας του άκρου. 2.3.1 Περιγραφή Η έκδοση 4.1cBSD του Unix ( 1982 ), για τους υπολογιστές VAX, απ το πανεπιστήμιο του Berkeley, πρωτοεισήγαγε το socket interface σαν μια μέθοδο επικοινωνίας απομακρυσμένων διεργασιών. Είχαν αρχικά υλοποιηθεί στην γλώσσα C του Unix, αλλά η απήχηση που γνώρισαν, επέβαλε την μεταφορά τους τόσο σε άλλα λειτουργικά συστήματα ( π.χ. Winsock library για τα Microsoft Windows ), όσο και σε άλλες γλώσσες προγραμματισμού ( π.χ. Java ). Κάθε πρόγραμμα διαβάζει από και γράφει σε ένα socket, με τρόπο παρόμοιο της εγγραφής και ανάγνωσης αρχείων του file system. Υπάρχουν δύο είδη sockets : Tο πρώτο ονομάζεται TCP ( Transmission Control Protocol ) socket και είναι μια υπηρεσία προσανατολισμένη στην σύνδεση ( connection-oriented service ). Μπορούμε να το θεωρήσουμε ανάλογο της τηλεφωνικής υπηρεσίας, στην 12

οποία, μετά την εγκαθίδρυση μιας σύνδεσης μεταξύ δύο συνομιλητών, αυτή χρησιμοποιείται μέχρι το πέρας της συζητήσεως τους. Το άλλο είδος ονομάζεται UDP (Unreliable Datagram Protocol ) socket και είναι μια υπηρεσία χωρίς σύνδεση ( connectionless service ). To ανάλογο, σε αυτήν την περίπτωση, είναι το ταχυδρομείο : μπορούμε να στείλουμε πολλά πακέτα στον ίδιο παραλήπτη, αλλά δεν είναι σίγουρο ότι όλα θα ακολουθήσουν την ίδια διαδρομή ( σύνδεση ) για να φτάσουν στον προορισμό τους. Μία ακόμη σημαντική διαφορά, μεταξύ των παραπάνω δύο ειδών, είναι ότι τα TCP sockets εξασφαλίζουν μια αξιόπιστη μεταφορά της πληροφορίας : ότι αποστέλλεται από το ένα άκρο είναι σίγουρο ότι θα φτάσει στο άλλο. Στο UDP socket όμως δεν συμβαίνει αυτό. Είναι στην ευθύνη του αποστολέα να ελέγξει ότι αυτό που έστειλε, το έλαβε τελικά ο παραλήπτης και δεν χάθηκε στον δρόμο. Από την άλλη, η σύνδεση με TCP socket απαιτεί την ανταλλαγή τριών πακέτων χειραψίας ( handshake packets ) και είναι πιο χρονοβόρα στην αρχικοποίησή της από την αντίστοιχη με UDP datagrams. Οι προηγούμενες δύο διαφορές καθορίζουν τελικά και την χρήση των δύο αυτών ειδών. Για την αποφυγή σύγχυσης, να σημειώσουμε ότι ειδικά στην Java, ο όρος Socket χρησιμοποιείται για τα TCP sockets, στην ονοματολογία των κλάσεων και των μεθόδων, ενώ για την δήλωση των UDP sockets, χρησιμοποιείται ο όρος Datagram. 2.3.2 Λειτουργία Στον παρακάτω πίνακα βλέπουμε τις διάφορες κλάσεις για τα sockets που περιέχονται στο πακέτο java.net καθώς και το είδος τους. Μηχανισμός / Κλάση Περιγραφή Socket TCP άκρο - πελάτης ServerSocket ΤCP άκρο - εξυπηρετητής DatagramSocket UDP άκρο ( client & server ) DatagramPacket UDP πακέτο 13

ΙnetAddress Διεύθυνση Internet Protocol (IP) URL Uniform Resource Locator URLConnection Σύνδεση με αντικείμενο του web. 2.3.2.1 Το μοντέλο client-server Το ευρύτερα διαδεδομένο μοντέλο ανάπτυξης δικτυακών εφαρμογών είναι το μοντέλο του πελάτη-εξυπηρετητή (client- server ). Ο εξυπηρετητής είναι μια διεργασία, η οποία εκτελείται σε έναν υπολογιστή και αναμένει να συνδεθεί σε αυτήν κάποιο πρόγραμμα - ο πελάτης, όπως ονομάζεται -, για να του παράσχει υπηρεσίες. Ένα τυπικό σενάριο που ακολουθείται συνήθως, είναι το εξής : 1. Η διεργασία - εξυπηρετητής αρχίζει να εκτελείται σε κάποιον υπολογιστή. Μετά την αρχικοποίησή της, πέφτει σε λήθαργο, αναμένοντας μία διεργασία - πελάτη να επικοινωνήσει μαζί της και να της ζητήσει κάποια υπηρεσία. 2. Μία διεργασία - πελάτης αρχίζει να εκτελείται, είτε στο ίδιο σύστημα, είτε σε κάποιο απομακρυσμένο, το οποίο συνδέεται με τον υπολογιστή στον οποίο τρέχει ο εξυπηρετητής μέσω δικτύου. Η διεργασία πελάτης στέλνει μια αίτηση, μέσω του δικτύου, στον εξυπηρετητή, ζητώντας του κάποιου είδους υπηρεσία ( π.χ. μεταφορά αρχείου, απομακρυσμένη εκτύπωση, ανάγνωση και αποστολή mail και άλλες ). 3. Ταυτόχρονα με την εξυπηρέτηση κάποιου πελάτη, ο server έχει την δυνατότητα να δέχεται και αιτήσεις άλλων πελατών προς εξυπηρέτηση. Όταν ο εξυπηρετητής τελειώσει με όλους τους πελάτες, τότε ξαναπέφτει σε λήθαργο, περιμένοντας για μια καινούργια αίτηση και η διαδικασία ξαναρχίζει από την αρχή. Ορίζουμε ως σύνδεση, τον επικοινωνιακό δίαυλο μεταξύ δύο διεργασιών. Την σύνδεση μπορούμε να την θεωρήσουμε ως μία πεντάδα, που περιγράφεται ως εξής : 14

{ πρωτόκολλο, τοπική-διεύθυνση, τοπική-διεργασία, απομακρυσμένη - διεύθυνση, απομακρυσμένη-διεργασία } Το πρωτόκολλο αναφέρεται στο σύνολο των κανόνων που διέπουν την επικοινωνία. Η τοπική-διεύθυνση και απομακρυσμένη-διεύθυνση, προσδιορίζουν την ταυτότητα των υποδικτύων και των υπολογιστών, στους οποίους εκτελούνται οι επικοινωνούσες διεργασίες. Η τοπική-διεργασία και απομακρυσμένη-διεργασία, προσδιορίζουν την ταυτότητα των διεργασιών που θα επικοινωνούν, καθώς σε έναν υπολογιστή, μπορούν να εκτελούνται περισσότερες της μιας διεργασίες. Κάθε μία από αυτές τις διεργασίες που εκτελούνται στον ίδιο host και που χρειάζονται επικοινωνία μέσω δικτύου, λαμβάνει έναν 16-bit ακέραιο αριθμό, ο οποίος αναπαριστά την θύρα ( port number ) της διεργασίας και κατ επέκταση, της υπηρεσίας. Ορίζουμε, επίσης ως μισή σύνδεση ( half association ), είτε το σύνολο { πρωτόκολλο, τοπική-διεύθυνση, τοπική-διεργασία }, είτε το σύνολο { πρωτόκολλο, απομακρυσμένη-διεύθυνση, απομακρυσμένη-διεργασία }. Η μισή σύνδεση ονομάζεται αλλιώς και socket. 2.3.2.2 Παράδειγμα TCP Socket: Ανάπτυξη Client - Server εφαρμογής με TCP sockets Στο σημείο αυτό θα ήταν χρήσιμο να δούμε μια υλοποίηση ενός TCP Socket μοντέλου βασιζόμενο στο μοντέλο Client-Server, ώστε να καταλάβουμε πόσο απλή είναι και πώς μεταφέρονται οι πληροφορίες όταν δημιουργηθεί μία σύνδεση. Μία από τις κλασικές υπηρεσίες που προσφέρονται στο δίκτυο, είναι η υπηρεσία αντήχησης ( echo service ). Η λειτουργία αυτή χρησιμοποιήθηκε προσαρμοσμένη στην πτυχιακή μας, με το κώδικα προσαρμοσμένο στις ανάγκες του λογισμικού μας για την μεταφορά του ήχου. Η λειτουργία echo που έχουμε παρακάτω ως παράδειγμα, χρησιμοποιεί για την σύνδεση TCP sockets και αριθμό θύρας 7, ενώ σκοπός της είναι να μεταδώσει πίσω στον πελάτη, που θα ζητήσει τέτοια υπηρεσία, ό,τι αυτός της στείλει. Δεν επεξεργάζεται δηλ. την είσοδο, απλά της στέλνει πάλι πίσω. Μία τέτοια εφαρμογή θα αναπτύξουμε εδώ σαν παράδειγμα, τόσο το πρόγραμμα της πλευράς του πελάτη, όσο και αυτό της πλευράς του εξυπηρετητή, μόνο που θα χρησιμοποιήσουμε έναν άλλο αριθμό θύρας, τον 8205. 2.3.2.3 O πελάτης ( client ) Μια τυπική αλληλουχία βημάτων που συνήθως ακολουθούνται για το πρόγραμμα του client είναι η εξής : Socket() - αρχικοποίηση και σύνδεση στον server 15

getinputstream() και - σύνδεση του socket με τον στάνταρ μηχανισμό getoutputstream() εισόδου/εξόδου στη Java, δηλ. τα streams read() και write() - ανάγνωση και εγγραφή στο - συνδεδεμένο με το socket - stream.. - ακολουθούν και άλλες αναγνώσεις/εγγραφές close() - κλείνει το socket και απελευθερώνεται ο αντίστοιχος πόρος του συστήματος. Ας αναλύσουμε περαιτέρω τα βήματα που αναφέραμε, πριν να παραθέσουμε το πλήρες πρόγραμμα του πελάτη. Η δημιουργία ενός αντικειμένου της κλάσης Socket, γίνεται, πολύ απλά, καλώ-ντας έναν από τους οκτώ (!) κατασκευαστές ( constructors ) της κλάσης. Στο πρόγραμμά μας γίνεται με τον εξής κώδικα : Socket s = new Socket(args[0], 8205); δηλ. φτιάξε το αντικείμενο s, που είναι socket και σύνδεσέ το στην ΙΡ διεύθυνση που καθορίζεται από την πρώτη παράμετρο (args[0] - στην συγκεκριμένη περίπτωση, η ΙΡ διεύθυνση παρέχεται από τον χρήστη, ως το πρώτο όρισμα στο command line, με την εντολή εκτέλεσης του προγράμματος ). Εφόσον η σύνδεση είναι επιτυχής, μπορούμε να λάβουμε τα streams εισόδου/εξόδου του socket που δημιουργήσαμε, για να επιτελέσουμε στην συνέχεια Ι/Ο. Αυτό γίνεται γιατί, όπως προαναφέραμε, ο ενοποιημένος ( και μοναδικός ) μηχανισμός για Ι/Ο προγραμμάτων σε Java είναι τα streams. Για τον σκοπό αυτό, χρησιμοποιούμε τις μεθόδους getinputstream() και getoutputstream() που διαθέτει η κλάση Socket, ως εξής : DataInputStream sin = new DataInputStream(s.getInputStream()); 16

DataOutputStream sout = new DataOutputStream(s.getOutputStream()); Μετά την αρχικοποίηση και την λήψη των streams του socket, έχουμε είσοδο/έξοδο με τις γνωστές μεθόδους των streams. Π.χ. : sout.println( Hello ); // Έξοδος στο socket String message = sin.readline(); // Είσοδος από το // socket Επίσης μπορούμε να λάβουμε από το ίδιο το socket s, μια σειρά από πληροφορίες σχετικές μ αυτό, όπως την ΙΡ διεύθυνση που είναι συνδεδεμένο, καθώς και το port. System.out.println( Connected to + s.getinetaddress() + : + s.getport()); Όταν τελειώσουμε με το Ι/Ο, καλό είναι να απελευθερώνουμε το socket που είχαμε ανοίξει, γιατί, όπως και οι χειριστές αρχείων ( file handlers ), είναι πολύτιμος πόρος του συστήματος και μπορεί να εξαντληθεί.... finally { try { if ( s!= null) s.close(); } catch(ioexception ioe) { ; } } 17

Ακολουθεί το ολοκληρωμένο πρόγραμμα του client μέρους της υπηρεσίας echo : // The client program for the echo service // Written using JDK, ver. 1.1.5 import java.io.*; import java.net.*; public class EchoClient { public static void echoclient(datainputstream sin, DataOutputStream sout) throws IOException { DataInputStream in = new DataInputStream(System.in); PrintStream out = new PrintStream(sout); String line; while(true) { line = ""; // read keyboard input and write to TCP socket try { line = in.readline(); out.println(line); } catch(ioexception e) { System.out.println(e.getMessage()); } // read TCP socket and write to terminal... try { line = sin.readline(); System.out.println(line); 18

} catch(ioexception e) { System.out.println(e.getMessage()); } } } // End of echoclient() function... public static void main(string[] args) { Socket s = null; try { // Create the socket to communicate with "echo" // on the specified host s = new Socket(args[0], 8205); // Create streams for reading and writing lines // of text from and to this socket DataInputStream sin = new DataInputStream(s.getInputStream()); DataOutputStream sout = new DataOutputStream(s.getOutputStream()); // Tell the user that we ve connected System.out.println("Connected to " + s.getinetaddress() + ":" + s.getport()); // Use the echo feature... echoclient(sin, sout); } catch(ioexception e) { System.out.println(e); } 19

// Always be sure to close the socket... finally { try { if (s!= null) s.close(); } catch(ioexception e) { System.out.println("Closing socket..."); } } } // End of main() } // End of class Να παρατηρήσουμε σε αυτό το σημείο, ότι οι εντολές που σχετίζονται με αρχικοποίηση του socket και των streams αυτού, θα πρέπει να περιέχονται στο σώμα try εντολής κι αυτό γιατί υπάρχει περίπτωση να μην είναι εφικτή η σύνδεση, οπότε θα έχουμε και έγερση μιας εξαίρεσης IOException. Σε μια τέτοια περίπτωση, δεν θα πρέπει να πραγματοποιήσουμε λειτουργίες Ι/Ο σε μη συνδεδεμένο socket. Επίσης, η μέθοδος close() είναι θεμιτό να καλείται σε κάθε περίπτωση, γι αυτό και την καλούμε μέσα από την finally. 2.3.2.4 Ο εξυπηρετητής ( server ) Μια τυπική TCP εφαρμογή εξυπηρετητή ανοίγει ένα καλά - γνωστό/διαδεδομένο port για την λήψη αιτήσεων για σύνδεση και ύστερα δημιουργεί μία διεργασίαπαιδί, ή ένα ξεχωριστό νήμα εκτέλεσης για να εκτελέσει την υπηρεσία. Το port που ανοίγει ο server ονομάζεται καλά-γνωστό, γιατί αυτό χρησιμοποιεί ο οποιοσδήποτε πελάτης για να συνδεθεί στον εξυπηρετητή. Επίσης λέμε ότι ο server ακούει το port στο οποίο αρχικοποιεί το socket του, για καινούργιες συνδέσεις, δηλ. καινούργιους πελάτες. Γι αυτό το λόγο, το socket ονομάζεται listening socket. Θα πρέπει να δοθεί προσοχή στην επιλογή του αριθμού θύρας της υπηρεσίας, ο οποίος δεν θα πρέπει να είναι ήδη σε χρήση. Ο εξυπηρετητής, μόλις δεχθεί την σύνδεση καινούργιου πελάτη, γεννά μια καινούργια διεργασία - νήμα, για την εξυπηρέτηση των αιτήσεων του. Με αυτόν τον τρόπο, καθίσταται δυνατή η παράλληλη εξυπηρέτηση παλιών και η αποδοχή νέων πελατών. 20

Παρακάτω θα αναπτύξουμε τον αντίστοιχο εξυπηρετητή του EchoClient, ο οποίος αποτελείται από δύο κλάσεις : την κλάση EchoServer, για την αρχικοποίηση του listening-socket και την κλάση EchoThread, η οποία κληρονομεί την κλάση Thread της Java. Αντικείμενα της τελευταίας δημιουργούνται κάθε φορά που εντοπίζεται από τον EchoServer ένας νέος πελάτης, αναλαμβάνοντας την εξυπηρέτησή του. Η αλληλουχία βημάτων για το πρόγραμμα του server είναι η εξής : ServerSocket() - αρχικοποίηση του listening socket accept() - αναμονή και εντοπισμός καινούργιου πελάτη new Thread - δημιουργία καινούργιου thread για την εξυπηρέτηση πελάτη getinputstream() και - το καινούργιο socket που επιστρέφεται από την accept getoutputstream() συνδέεται με τον στανταρ μηχανισμό εισόδου/εξόδου στη Java, δηλ. τα streams read() και write() - ανάγνωση και εγγραφή στο - συνδεδεμένο με το socket - stream.. - ακολουθούν και άλλες αναγνώσεις/εγγραφές close() - κλείνει το socket ( όχι το listening ) και απελευθερώνεται ο αντίστοιχος πόρος του συστήματος. Η κλάση ServerSocket περιέχεται στο πακέτο java.net και παρέχει μια ανεξάρτητη συστήματος υλοποίηση σύνδεσης TCP socket, απ την πλευρά του εξυπηρετητή, με βάση το client/server μοντέλο. Το αντικείμενο αυτής της κλάσης συνδέει το πρόγραμμα του εξυπηρετητή με κάποια θύρα του συστήματος, για να μπορεί αυτός στην συνέχεια να ακούει για την σύνδεση νέων πελατών. Στον κατασκευαστή του αντικειμένου προσδιορίζεται ο αριθμός θύρας και σε περίπτωση που δεν χρησιμοποιείται ήδη από άλλη υπηρεσία, δημιουργείται το αντικείμενο. Αν όμως η θύρα είναι κατειλημμένη, τότε εγείρεται εξαίρεση. Ο κώδικας είναι ως εξής : ServerSocket serversoc = new ServerSocket(8205); Αν το αντικείμενό μας κατασκευαστεί επιτυχώς, τότε ο server είναι έτοιμος για την αποδοχή καινούργιου πελάτη : 21

Socket incoming = serversoc.accept(); Η μέθοδος accept() μπλοκάρει το νήμα απ το οποίο έχει κληθεί, μέχρι να παρατηρηθεί δραστηριότητα στο listening-socket, δηλ. μέχρι να συνδεθεί καινούργιος πελάτης. Όταν συμβεί το τελευταίο, τότε η accept() επιστρέφει ένα καινούργιο Socket ( όχι listening-socket ) με το οποίο αρχίζει πλέον η επικοινωνία. Αυτό συμβαίνει για να μπορούμε να συνεχίσουμε να ακούμε απ το listening socket και άλλους πελάτες, χωρίς να χρειάζεται να αλλάξουμε τον αριθμό της θύρας ( well-known ). Επίσης, κατασκευάζεται ένα νέο αντικείμενο τύπου EchoThread και αρχίζει η εκτέλεσή του : EchoThread et = new EchoThread(incoming); et.start(); Στην κατασκευή του νέου thread περνούμε σαν παράμετρο το socket που επέστρεψε η accept(), για να λάβουμε ύστερα, τα συνδεδεμένα με αυτό, streams εισόδου/εξόδου : DataInputStream in = new DataInputStream(s.getInputStream()); PrintStream out = new PrintStream(s.getOutputStream()); Από εκεί και πέρα ακολουθεί Ι/Ο στο socket ( μέσω των streams του ), σαν να είχαμε Ι/Ο σε αρχείο. Στο τέλος, το thread εξυπηρέτησης του πελάτη κλείνει το socket που μας είχε επιστρέψει η accept ( μέθοδος close() ) και τερματίζει την εκτέλεσή του. Το listening socket παραμένει ανοικτό, απελευθερώνεται όμως πριν τον τερματισμό του ίδιου του EchoServer. Πάλι σημειώνουμε την χρήση των μπλοκ try, για να αποφύγουμε την περίπτωση της χρησιμοποίησης κάποιου πόρου ( στην περίπτωσή μας socket ), ο οποίος πιθανόν δεν μας έχει διατεθεί από το σύστημα. Ακολουθεί το πλήρες πρόγραμμα του εξυπηρετητή της υπηρεσίας echo, με τις δύο κλάσεις του. // Server program for the echo service. An alternative // to the standard echo at port 7. We use TCP port 8205. 22

// Written using JDK 1.1.5 import java.net.*; import java.io.*; import java.lang.*; import java.util.*; public class EchoServer { public static void main(string args[]) { // initialize the network connection try { ServerSocket serversoc = new ServerSocket(8205); // Now sit in an infinite loop and wait for // requests... while (true) { // accept the message Socket incoming = serversoc.accept(); // spawn a child to serve the request EchoThread et = new EchoThread(incoming); et.start(); } } catch (IOException e) { System.out.println("Error : " + e.getmessage()); } } // End of main 23

} // End of class EchoServer() class EchoThread extends Thread { // The socket we are writing to Socket s; // Our constructor EchoThread(Socket s) { this.s = s; } // The run method of the thread... public void run() { boolean finished = false; try { // Create streams for reading / writing lines of text to the socket DataInputStream in = new DataInputStream(s.getInputStream()); PrintStream out = new PrintStream(s.getOutputStream()); // Print a message: System.out.println("Client from : " + s.getinetaddress() + " port " + s.getport()); // now get the input from the socket... while(!finished) { String st = in.readline(); // Send the same back to client 24

out.println(st); // Write it to the screen as well System.out.println(st); // If the input was 'quit' then exit... if (st.equals("quit")) { finished = true; System.out.println("Thread exiting..."); } } } catch (IOException e) { System.out.println("Error : " + e.getmessage()); } // Always be sure to close the socket... finally { try { if (s!= null) s.close(); } catch(exception e) { System.out.println("Error : " + e.getmessage()); } } } // End of run } // End of class EchoThread... 2.3.2.5 Κατασκευαστές και μέθοδοι κλάσης Socket Παραθέτουμε, ενδεικτικά, μερικούς από τις μεθόδους και τους κατασκευαστές της κλάσης Socket. 25

Κατασκευαστές Socket(InetAddress, int) Δημιουργεί ένα stream ( TCP ) socket και το συνδέει στο port και την ΙΡ διεύθυνση που καθορίζονται ως παράμετροι. Socket(String, int) Δημιουργεί ένα stream ( TCP ) socket και το συνδέει στο port του host, του οποίου το όνομα καθορίζεται στις παραμέτρους. Μέθοδοι close() Κλείσιμο του socket ( απελευθέρωσή του πίσω στο σύστημα ). getinetaddress() Επιστρέφει την διεύθυνση του απομακρυσμένου host στην οποία το socket είναι συνδεδεμένο. getinputstream() Επιστρέφει ένα stream εισόδου γι αυτό το socket. getlocaladdress() Επιστρέφει την διεύθυνση του host στον οποίο το socket αρχικοποιήθηκε ( την τοπική διεύθυνση ). getlocalport() Επιστρέφει τον αριθμό θύρας ( τοπικό ) του host στον οποίο το socket αρχικοποιήθηκε. getoutputstream() 26

Επιστρέφει ένα stream εξόδου αυτού του socket. getport() Επιστρέφει τον αριθμό θύρας του απομακρυσμένου host στον οποίο το socket έχει συνδεθεί. 2.3.2.6 Κατασκευαστές και Μέθοδοι της κλάσης ServerSocket Παραθέτουμε, ενδεικτικά, μερικούς από τις μεθόδους και τους κατασκευαστές της κλάσης ServerSocket. Κατασκευαστές ServerSocket(int) Δημιουργεί ένα server socket στη θύρα της οποίας ο αριθμός καθορίζεται απ την παράμετρο. Αν ο αριθμός είναι το 0, τότε αφήνεται στο σύστημα η επιλογή μιας ελεύθερης ( μη χρησιμοποιούμενης ) θύρας. ServerSocket(int, int) Δημιουργεί ένα server socket στην θύρα της οποίας ο αριθμός καθορίζεται απ την πρώτη παράμετρο, ενώ επιτρέπει τόσες συνδέσεις να περιμένουν στην ουρά του port, μέχρι να γίνουν αποδεκτές, όσες η δεύτερη παράμετρος. Και εδώ, το 0 επιλέγει μια ελεύθερη θύρα. Μέθοδοι accept() Ακούει το server socket για πιθανή σύνδεση που θα γίνει και την αποδέχεται. close() 27

Κλείνει το server socket. getinetaddress() Επιστρέφει την τοπική διεύθυνση αυτού του server socket. getlocalport() Επιστρέφει το port που αυτό το server socket ακούει. 2.4 Σύνοψη-Συμπεράσματα Συμπερασματικά παρατηρούμε τα εξής στα παραπάνω χαρακτηριστικά παραδείγματα προγραμματισμού sockets σε server και client: Με την Java, ο προγραμματισμός των sockets είναι ένα πολύ απλό θέμα και απαιτεί λίγες σχετικά γραμμές κώδικα. Η αποστολή και λήψη μηνυμάτων εξομοιώνεται με τις γενικές αρχές του I/O στην γλώσσα αυτή. Το αντικείμενο SocketServer αφορά τον server, δηλ. αυτόν πού δέχεται κλήσεις και οφείλει να ανταποκριθεί σε αυτές. Αντίθετα ο client επενεργεί αποκλειστικά με αντικείμενο Socket. Υπάρχει πάντοτε θέμα πολυ-προγραμματισμού για τον server, το οποίο στην περίπτωση της Java επιλύεται με threads. Υπάρχει θέμα εισαγωγής timeouts σε όλες τις περιπτώσεις πού αναμένομε κάτι να αφιχθεί από την άλλη μεριά. Δεν μας απασχολεί το port no του client. Ο client δεν αναμένει δημιουργία νέας σύνδεσης από την πλευρά του δικτύου ώστε να χρειάζεται να γνωρίζει που να την συνδέσει. Στην μεριά του client ασχολούμαστε μόνο με το αντικείμενο socket που εμείς δημιουργήσαμε και μέσω του οποίου χρησιμοποιούμε και διαχειριζόμαστε την σύνδεση. 28

ΚΕΦΑΛΑΙΟ 3 Οι εφαρμογές 3.1 Το πακέτο εφαρμογών μας Οι απαιτήσεις της εργασίας αυτής επέβαλαν για την ανάπτυξη των ζητούμενων την δημιουργία ενός πακέτου εφαρμογών που θα ήταν ένας εξομοιωτής synthesizer, τόσο για το περιβάλλον τον Microsoft Windows, όσο και για αυτό του Android, για τις εκδόσεις από 4.4.2 και πάνω. Έτσι, αρχικά αναπτύξαμε για τα Windows από την αρχή μια εφαρμογή ενός εξομοιωτή synthesizer, χρησιμοποιώντας το γνώριμο λογισμικό NetBeans και σαν εργαλείο την γλώσσα Java στην τελευταία έκδοσή της. H γλωσσα επιλέχθηκε διότι μας προσέφερε ευελιξία, ώστε στη συνέχεια να αναπτυχθεί με την ίδια η εφαρμογή για Android στο νεαρής ηλικίας λογισμικό Android Studio, που αποτελεί πλέον το επίσημα υποστηριζόμενο από την Google λογισμικό ανάπτυξης Android εφαρμογών. Ας δούμε λοιπόν τις εφαρμογές των Windows. Οι εφαρμογές ονομάστηκαν PianoServer και PianoClient(αναπτύχθηκε μια client για Windows και μια για Android). Η PianoServer είναι αυτή που δημιουργήθηκε με σκοπό να αποτελέσει την server εφαρμογή στο Socket που αναπτύχθηκε μεταξύ 3 υπολογιστικών συστημάτων, δύο σε Windows και μία σε Android. Η εφαρμογή PianoServer περιλαμβάνει τρία Jframe: τα Piano_play.java, ByzMusic.java, Music.java και μια κλάση RecieveMessage.java. Αντίστοιχα και η εφαρμογή PianoClient περιλαμβάνει 3 JFrame ClientForm.java, ByzMusic.java, Music.java και μια κλάση ReceiveMessage.java. Θα εξηγήσουμε στην πορεία την λειτουγία όλων αυτών των αρχείων java. 3.2 Το Interface Τα αρχεία JFrame Piano_play.java και ClientForm.java δημιουργούν τα γραφικά περιβάλλοντα που βλέπουμε παρακάτω, του PianoServer και PianoClient αντίστοιχα. Είναι γενικά οι βασικές κλάσεις και των 2 εφαρμογών και οι βασικότερες διεργασίες εκτελούνται σε αυτές. 29

Piano Server Piano Client 30

Το περιβάλλον που έχουμε δημιουργήσει είναι όπως βλέπουμε ίδιο και στις 2 περιπτώσεις. Κάθε πλήκτρο έχει δημιουργηθεί ώστε να μην είναι «νεκρό», αλλά έχοντας ευαισθησία ακόμα και στο απλό πέρασμα του κέρσορα από επάνω τους, ακόμα και αν δεν πατηθούν, πράγμα που είναι ορατό, αφού αλλάζουν φωτεινότητα στην περίπτωση αυτή. Τα λευκά πλήκτρα που δημιουργήθηκαν είναι κατά σειρά από αριστερά προς τα δεξιά τα C D E F G A B C1 D1 E1 και οι αντίστοιχες διέσεις οι C# D# F# G# Bb C#1 Eb. Σε κάθε πίεση του πλήκτρου από τον κέρσορα με κλικ το αντίστοιχο πλήκτρο μετακινείται προς τα κάτω, ουσιαστικά γίνεται δηλαδή μια εξομοίωση της πίεσης ενός πλήκτρου ενός αληθινού synthesizer. Για να δούμε το θέμα από την «πίσω» πλευρά του, την προγραμματιστική, σε κάθε πίεση ενός πλήκτρου έχει ανατεθεί μια συγκεκριμένη διαδικασία. Το πλήκτρο όταν το πρόγραμμα τρέχει αναμμένη από τον χρήστη να πιεστεί, δηλαδή υπάρχει ένας listener που περιμένει την πράξη της πίεσης πλήκτρου. Όταν αυτή συμβεί, εκτελείται η αναπαραγωγή ενός.wav αρχείου, που κάθε φορά είναι αρχείο της νότας του αντίστοιχου πλήκτρου(του αντίστοιχου οργάνου, που έχει επιλέξει ο χρήστης). Ο χρόνος που θα ανοιχτεί και θα κλείσει το αρχείο είναι συγκεκριμένος και έχει προκαθοριστεί από εμάς. Η συγκεκριμένη ενέργεια γίνεται όσες φορές ζητηθεί από το πρόγραμμα και δεν παρουσιάζει καμία καθυστέρηση που να είναι αντιληπτή από τον χρήστη. Στην μουσική πλευρά τώρα, το κάθε αρχείο.wav είναι μια συγκεκριμένη νότα ξεκινώντας από το C.WAV που είναι η νότα C = C4 = 259,412Hz καταλήγοντας στην νότα 31

Ε1. Για λόγους ευχρηστίας και ευκολότερης ανάπτυξης, κυρίως λόγω της μικρής «φιλικότητας» της Java απέναντι στη μουσική και τα θέματά της, χρησιμοποιήσαμε wav αρχεία και όχι πιο σύγχρονα format μουσικών αρχείων. Επιπλέον, οι διάφορες συναρτήσεις παραγωγής ήχου δεν ήταν ιδιαίτερα αξιόπιστες στην απόδοση ήχων με τον τρόπο που θα θέλαμε και θα ήταν σίγουρα πιο προσιτοί στο ανθρώπινο αυτί. Τέλος, να τονίσουμε ότι τα αρχεία είναι ενσωματωμένα στο πακέτο προγραμμάτων που αναπτύξαμε καθαρά για λόγους ευκολίας. Είναι πολύ εύκολο να τροποποιηθούν τα αρχεία από κάποιον που γνωρίζει προγραμματισμό και να αλλαχτούν ακόμη και εξολοκλήρου οι επιλογές οργάνων που έγιναν. Στο επάνω μέρος της εφαρμογής βλέπουμε τα πλήκτρα επιλογής του οργάνου που θέλουμε να παίζει ο εξομοιωτή μας. Τα όργανα που εμείς εισάγαμε ήταν τα εξής: Double Bass, Steel Drums, Piano, Electric και η Ποντιακή λύρα, λόγου του της καταγωγής του δημιουργού. Ο χρήστης μπορεί να επιλέξει ποιο όργανο θα ακούγεται ενώ πατάει τα πλήκτρα(παίζει μουσική). Αρχικά σαν προεπιλεγμένο από default είναι το πιάνο. Ωστόσο, μπορεί να επιλέξει οποιαδήποτε στιγμή το επιθυμεί κάποιο άλλο όργανο και η αλλαγή γίνεται άμεσα. Η παραπάνω διαδικασία γίνεται με τη μεταβλητή που ονομάσαμε M_Organo στην οποία κάθε φορά επιλέγεται που ο χρήστης θα επιλέξει ένα όργανο, στη μεταβλητή μας αποθηκεύεται ένας χαρακτήρας, που είναι το πρώτο γράμμα του κάθε οργάνου που επιλέχθηκε. Έτσι, το σύστημα γνωρίζει ανά πάσα στιγμή ποιο όργανο είναι επιλεγμένο και αναγνωρίζει άμεσα κάθε εναλλαγή, τη στιγμή που γίνεται. Με τον τρόπο αυτό αναπαράγει κάθε φορά το αντίστοιχο αρχείο που χρειάζεται. Η νότα που αναπαράγεται θα είναι η Nota=M_Organo+Nota; Το M_Organo αρχικοποιείται με την τιμή p, δηλαδή αντιστοιχεί στο πιάνο, που όπως προείπαμε είναι επιλεγμένο by default. Τέλος, να πούμε ότι η λειτουργία της εφαρμογής επιτρέπει να πατηθούν πλήκτρα ταυτόχρονα ή πολλές φορές συνεχόμενα και η εφαρμογή να εκτελεί όλες τις εντολές άμεσα χωρίς σφάλμα. 3.2.1 Piano Server Η εφαρμογή PianoServer, εκτός από τις λειτουργίες που υλοποιήθηκαν στην ανάπτυξή της, φιλοξενεί και μία επιπλέον λειτουργία, που ίσως είναι και η σημαντικότερης σημασίαw για αυτήν την πτυχιακή εργασία. Το πρόγραμμα έχει την δυνατότητα να ξεκινάει μια λειτουργία Client-Server, σύμφωνα με τις αρχές που περιγράψαμε πιο πάνω, στο κεφάλαιο των Sockets, αφού ουσιαστικά το δίκτυο που δημιουργείται είναι ένα socket. O χρήστης, πιέζοντας το πλήκτρο Start Server, έχει τη δυνατότητα να δημιουργήσει ένα server στο τοπικό δίκτυο που είναι συνδεδεμένοι οι υπολογιστές μας (εμείς το δοκιμάσαμε στο πιο προηγμένο τεχνολογικά που είχαμε, το δίκτυο Wifi) και να είναι 32

«ορατός» σε κάθε συσκευή client που θα μπορούσε να το «δει», εφόσον έχει το αντίστοιχο λογισμικό client σε κάποια εφαρμογή της. Ο server μας πλέον περιμένει στην αναμονή αίτημα από οποιονδήποτε client για να συνδεθεί μαζί του. 3.2.2 Piano Client Ο Piano Client από τη μεριά του, εκτός από τις προαναφερόμενες μουσικές λειτουργίες που έχει και μοιράζεται με τον Server, διαφέρει από τον τελευταίο επειδή έχει την δυνατότητα να στέλνει αιτήσεις σύνδεσης σε διαθέσιμους Server το τοπικού δικτύου μας. Αυτό γίνεται με το αντίστοιχο κουμπί Connect Server και υλοποιείται με τον αντίστοιχο κώδικα, με μικρές τροποποιήσεις, που δίνεται σαν παράδειγμα στο κεφάλαιο των sockets. Ωστόσο, για να επιτευχθεί η σύνδεση θα πρέπει να γνωρίζουμε την IP που «κατέχει» ο Server μας το τοπικό δίκτυο, έτσι ώστε να ρυθμίσουμε τον client για να τον αναζητήσει. Επιπροσθέτως, θα πρέπει να ορίσουμε τόσο στον Server όσο και στον Client μια πόρτα(port) μέσω της οποίας θα επιτευχθεί η σύνδεση μεταξύ των δύο εφαρμογών. Αυτό γίνεται από τον κώδικα και προρυθμίζεται πριν εκκινήσουμε τις εφαρμογές μας. 33

3.3.1 Οι δύο εφαρμογές σε αλληλεπίδραση Επομένως όταν δημιουργηθεί ένας server από το PianoServer και στην συνέχεια ο PianoClient εντοπίσει τον Server και συνδεθεί σε αυτόν, έχουμε βάλει να εμφανίζονται μηνύματα επιτυχίας ή αποτυχίας. Αν συνδεθούν στον Server εμφανίζεται client request accepted, ενώ στον client εμφανίζεται connected to server. Ενώ αν ο server ξαναδημιουργήσει έναν server εμφανίζεται το μήνυμα No client Avaivable. 34

3.3.2 Πεδίο Chat Επίσης υπάρχουν ακόμα το κουμπί send, ένα textarea και ένα textfield και στις 2 εφαρμογές. Τα οποία μας βοηθούν στην συζήτηση μεταξύ server και client αν χρειαστεί, αλλά και στο να γνωρίζουμε τι πλήκτρα πατάει ο client. Πως όμως χρησιμοποιούνται όλα αυτά? Μπορούμε να γράψουμε ένα μήνυμα (οποιασδήποτε μορφής) στο πεδίο του textfield και στην συνέχεια αφού έχουμε την ευκαιρία διόρθωσης του μηνύματος, πατώντας το κουμπί send αποστέλλουμε το μήνυμα μας. Το μήνυμα αυτό θα εμφανιστεί στον client στο πεδίο του textarea. Ομοίως, ο client έχει την δυνατότητα να «απαντήσει» στον server, δηλαδή να δημιουργηθεί ένας «διάλογος», δηλαδή μια αμφίδρομη επικοινωνία, πράγμα που είναι μια από τις πιο σύγχρονες μορφές διαδραστικότητας στην ψηφιακή εποχή που ζούμε. Πακέτα δεδομένων στέλνονται με την πίεση του send από τον server στον client και vice versa. Ενδεικτικά, οι ενέργειες που αναλύσαμε φαίνονται στις παρακάτω εικόνες, από προηγούμενη εξομοίωση που πραγματοποιήσαμε: 35

3.4 Επικοινωνία Server-Client Στην περίπτωση που ο Client είναι συνδεδεμένος με τον Server όταν πατηθεί μια νότα στον client κατευθείαν εμφανίζει στο textarea του Server ποια ή ποιες νότες έχουν πατηθεί. Επίσης όταν πατηθεί η νότα στον Client αναπαράγεται από τον Client αλλά και από τον Server. Πώς το πετυχαίνουμε αυτό όμως. Η νότα που επιλέγεται από τον Client εκτός του ότι αναπαράγει ένα.wav αρχείο, στέλνει και μια πληροφορία στον Server, στην ουσία ποια νότα πατήθηκε. Ο Server με την σειρά του λαμβάνει την πληροφορία, η οποία μεταφράζεται, ενώ παράλληλα εμφανίζεται η αντίστοιχη νότα στο πεδίο textarea και αναπαράγει το κατάλληλο.wav αρχείο. Ο server θα εκτελέσει την αναπαραγωγή του τρέχοντος αρχείου που εκτελεί και ο Client (ίδιο όργανο, ίδια νότα ) και παράλληλα θα μπορεί να παίξει μια οποιαδήποτε νότα με οποιοδήποτε όργανο από την ίδια την εφαρμογή. 36

Με τον τρόπο αυτό είναι δυνατόν ο χρήστης να παίξει από υπολογιστή, κινητό ή ταμπλέτα(για τα δύο τελευταία θα παρουσιάσουμε συνοπτικά την αντίστοιχη εφαρμογή που υλοποιήθηκε παρακάτω) και να ακούγεται ο ήχος τόσο από το ίδιο το μηχάνημα που παίζει, όσο και από το άλλο απομακρυσμένο μηχάνημα. Τα 2 λειτουργικά συστήματα που συμμετέχουν θα έχουν την δυνατότητα να παίζουν ταυτόχρονα και με οπτικοακουστική επικοινωνία μεταξύ των χρηστών. Επιπλέον, ο Client μπορεί να πληκτρολογήσει στο πεδίο textfield του, τις νότες που θέλει, να πατήσει το κουμπί send και στην συνέχεια οι νότες αυτές να αναπαραχθούν από τον Server. Προγραμματιστικά τώρα, αυτές οι λειτουργίες που βοηθούν στην επικοινωνία των 2 συστημάτων, υποστηρίζονται από την κλάση ReceiveMessage.javva η οποία υπάρχει και στον Server αλλά και στον Client. Στην ουσία η κλάση δέχεται 2 ορίσματα το textarea του τρέχοντος συστήματος που βρίσκεται και το μήνυμα που δέχεται το τρέχων σύστημα. Και μετά αναλόγως, εμφανίζει το μήνυμα στο πεδίο textarea και αν απαιτείται κάνει και την αναπαραγωγή της νότας που δόθηκε. Τα πλεονεκτήματα στο παράλληλο(ταυτόχρονο) παίξιμο των Server και Client είναι πολύ σημαντικά: έχουμε πετύχει την μέγιστη μείωση χρόνου καθυστέρησης αναπαραγωγής της νότας και παράλληλα δίνουμε την ευκαιρία σε Server και Client να πετυχαίνουν πλήρη παραλληλισμό χωρίς καθυστερήσεις που θα ήταν αντιληπτές. 3.5 Η εφαρμογή για Android συσκευές Πριν προχωρήσουμε παρακάτω, δεν θα πρέπει να παραλείψουμε ένα πολύ σημαντικό κομμάτι της ανάπτυξης του πακέτου εφαρμογών μας, την ανάπτυξη ενός Client για συσκευές Android, κατάλληλου για χρήση σε κινητά ή ταμπλέτες. Είναι τόσο διαδεδομένη η χρήση φορητών συσκευών στην καθημερινή ζωή μας στην εποχή που ζούμε, που κάθε οικογένεια σχεδόν έχει στην κατοχή της μία. Αυτόν μας δίνει ένα πολύ μεγάλο κίνητρο- αφού το κοινό που μπορούσε να το χρησιμοποιήσει είναι τεράστιο- στο να αναπτύξουμε ένα app το οποίο θα υλοποιεί στη ουσία τον εξομοιωτή synthesizer στη φορητή συσκευή μας για να μπορεί ο χρήστης να παίξει μουσική πατώντας με τα δάχτυλά του τα κουμπιά στην οθόνη αφής της συσκευής του. Αυτό έχει ιδιαίτερη σημασία, γιατί ο χρήστης εξομοιώνει στον απόλυτο βαθμό το «παίξιμο» ενός synthesizer, αφού καλείται να παίξει μουσική κάνοντας με τα δάχτυλά του ακριβώς τις ίδιες κινήσεις που θα έκανε έχοντας μπροστά του ένα πραγματικό synthesizer. Επιπρόσθετα, η ευαισθησία των σύγχρονων συσκευών μας επιτρέπει την πίεση πολλών σημείων της οθόνης ταυτόχρονα(ευαισθησία πολλών σημείων), δηλαδή ο χρήστης μπορεί να πατάει στην εφαρμογή μας πολλά πλήκτρα ταυτόχρονα και να 37

αναγνωρίζονται από το λειτουργικό της φορητής συσκευής του όλες οι ενέργειές του. Αυτό είναι ζωτικής σημασίας, μιας και στο «παίξιμο» των πραγματικών synthesizer οι μουσικοί για να παράγουν τους επιθυμητούς ήχους, πατούν πολλά πλήκτρα ταυτόχρονα. Άρα και πάλι έχουν απόλυτη εξομοίωση στο θέμα αυτό. 3.5.1 Piano Client(Android) Η ανάπτυξη του app για Android του Piano Client έγινε στην τελευταία έκδοση του Android Studio, σε γλώσσα Java. Ο κώδικας που χρησιμοποιήθηκε ήταν παρόμοιος με τις κατάλληλες τροποποιήσεις με αυτόν του Piano Client για λειτουργικά συστήματα Windows. Ωστόσο, έπρεπε να δημιουργηθεί και το κατάλληλο μανιφέστο(android Manifest), ώστε η εφαρμογή μας να λειτουργεί κανονικά και χωρίς σφάλματα στα λειτουργικά Android. 3.5.2 Το Interface του app Στο interface της εφαρμογής δεν εντοπίζονται διαφορές, πέρα από τις οπτικές(μορφοποίηση) στις λειτουργίες σε σχέση με την εφαρμογή client για Windows, εκτός από τον τρόπο λειτουργίας Socket που ενσωματώσαμε στο app μας. Στην περίπτωση των Windows, την IP του server και την πόρτα που θα χρησιμοποιούσαμε για την σύνδεση των 2 συσκευών μας τις προρυθμίζαμε μέσα από τον κώδικα της Client εφαρμογής. Στη περίπτωση του Android app μας, θα πρέπει να εισάγουμε την IP του server στο πεδίο dstaddress και τον αντίστοιχο αριθμό της πόρτας που θέλουμε να χρησιμοποιήσουμε στο πεδίο dstport. Τα δύο αυτά πεδία βρίσκονται στο πάνω μέρος του κύριου Screen της εφαρμογής μας. Όταν συμπληρώσουμε τα δύο πεδία με τους σωστούς αριθμούς, πατάμε το πλήκτρο Connect και αν υπάρξει σύνδεση παίρνουμε μήνυμα επιτυχημένης διασύνδεσης μόνο στην οθόνη του Server όπως ακριβώς γινόταν και στην σύνδεση μεταξύ συσκευών με λειτουργικό Windows, όπως περιγράφεται παραπάνω. Τέλος, να τονίσουμε ότι υπάρχει ένα επιπλέον πλήκτρο ON/OFF που αν πατηθεί ενεργοποιεί την λειτουργία αποστολής μηνυμάτων στον server ώστε να λειτουργεί κανονικά όπως και παραπάνω η λειτουργία Socket. Αν π.χ. το κουμπί είναι στην λειτουργία OFF o Client αναπαράγει κανονικά τους ήχους από τα πλήκτρα που πατιούνται στον ίδιο, όμως δεν αποστέλλονται μηνύματα στον Server με τα πλήκτρα που πατάει ο χρήστης στην φορητή συσκευή και όπως είναι φυσικό ο Server δεν αναπαράγει κανέναν ήχο. Η λειτουργία του πλήκτρου ON/OFF είναι στην επιλογή OFF by default. Παρακάτω βλέπετε το Interface του app που αναπτύξαμε: 38

3.6 Ένα χαρακτηριστικό παράδειγμα εφαρμογής του πακέτου μας Παρακάτω βλέπουμε τον παγκοσμίου φήμης Έλληνα συνθέτη Βαγγέλη Παπαθανασίου πριν αρκετά χρόνια, να χρησιμοποιεί στο στούντιό του πολλά συνθεσάιζερ μαζί, για να ηχογραφήσει τον υψηλής ποιότητας χαρακτηριστικό ήχο του. 39

Πλέον, με εφαρμογές σαν αυτές που αναπτύξαμε, μπορούμε να συνδέσουμε συσκευές μεταξύ τους που είναι πολύ λεπτότερες σε σχέση με τα synthesizer που βλέπουμε παραπάνω, πολύ φθηνότερες, με μικρή κατανάλωση ενέργειας και με τέτοια ευαισθησία στις οθόνες αφής τους, ώστε μπορούν να αναγνωρίζουν ακόμα και την επαφή του ανθρώπινου χεριού με την οθόνη σε 8 έως 10 διαφορετικά σημεία. Το τελευταίο είναι πολύ σημαντικό, διότι μπορούν να προσομοιώσουν πολύ ρεαλιστικά ένα synthesizer, αφού ο χρήστης μπορεί να πιέζει τα πλήκτρα του εικονικού πληκτρολογίου με όλα τα δάχτυλα των χεριών, όπως ένας μουσικός που παίζει μουσική σε ένα πραγματικό synthesizer. Μερικές χαρακτηριστικού τύπου συσκευές είναι οι παρακάτω: 40

Έτσι, ο μεγάλος Έλληνας συνθέτης θα μπορούσε να έχει μπροστά του μια διάταξη σαν την παρακάτω, έχοντας παράλληλα όλα τα πλεονεκτήματα που προαναφέραμε παραπάνω: Σε αυτήν παρατηρούμε ότι χρειαζόμαστε 3 Android συσκευές και 2 ηλεκτρονικούς υπολογιστές με λειτουργικό Windows και οθόνη αφής. Έτσι, παρέχουμε 4 synthesizer στο μουσικό/ερευνητή. Επίσης, μπορούμε να προσθέσουμε μια κονσόλα παραμετροποίησης του ήχου που εξάγουν οι υπόλοιπες συσκευές(εύκολα βρίσκει κάποιος μία εφαρμογή λογισμικού ανοιχτού κώδικα που να την υλοποιεί). Κάθε συσκευή ενώνεται ασύρματα, πράγμα σημαντικό, αφού πλέον γλιτώνουμε από την πληθώρα καλωδίων που είναι απαραίτητα και εγκαταλείπουμε τεχνολογίες που θεωρούνται παρωχημένες, όπως π.χ. το πρωτόκολλο MIDI. Ακόμη, μπορούμε να ρυθμίσουμε πολλαπλά κάθε εξομοιωτή μας, ως προς το όργανο που θα παίζει. Τέλος, να σημειωθεί ότι μια διάταξη σαν αυτή που παρουσιάζουμε θα περιόριζε σημαντικά το κόστος κτήσης των απαραίτητων συσκευών για την παραγωγή ήχου σε επίπεδα χαμηλότερα ενός μόνο καλού synthesizer, δηλαδή είναι πλέον αυξημένη η προσιτότητα για τον καθημερινό χρήστη. 41

ΚΕΦΑΛΑΙΟ 4 Μικροτονική, Βυζαντινή Μουσική, Παραδοσιακά όργανα 4.1 Κλίμακα Είδαμε λοιπόν ως τώρα ένα μουσικό πιάνο που σου επιτρέπει να μπορείς να παίζεις μουσική χωρίς να έχεις κάποιο μουσικό όργανο και επίσης να υπάρξει μια επικοινωνία με κάποιο άλλο μουσικό όργανο ή και κάποια ηχογράφηση μέσω ενός pc χωρίς να πρέπει να συνδέσεις το μουσικό σου όργανο με καλώδια σε στο pc ή κάπου αλλού. Το πιάνο αυτό όμως βασίζεται στα Ευρωπαϊκά πρότυπα μουσικής και χρησιμοποιεί τις ευρωπαϊκές κλίμακες. ΟΡΙΣΜΟΣ: Λέγοντας Κλίμακα [<αρχ. κλῖμαξ < κλίνω] ή Σκάλα, εννοούμε μία σειρά από μουσικούς ήχους-νότες που ο αριθμός τους ποικίλει από κλίμακα σε κλίμακα, και την οποία χρησιμοποιούν οι μουσικοί κάθε λαού ως βάση για την δημιουργία της μουσικής και των τραγουδιών τους. Οι νότες κάθε μουσικής κλίμακας, έχουν ένα συγκεκριμένο τρόπο διάταξης μέσα σ' αυτήν και όταν λέμε διάταξη αναφερόμαστε κυρίως στις ηχητικές αποστάσεις που απέχουν οι νότες αυτές μεταξύ τους. Υπήρξαν και υπάρχουν πολυάριθμες και διαφορετικές μεταξύ τους ως προς την διάταξη κλίμακες, που κάθε δημιουργός-λαός τις ονομάζει με έναν δικό του τρόπο: Οι αρχαίοι Έλληνες για παράδειγμα, ονόμαζαν γενικά τις κλίμακες ως τρόπους και σε κάθε τρόπο έδιναν ανάλογα με την διάταξή του και ένα διαφορετικό όνομα, 42

παρμένο από τόπους και λαούς που τους πρωτο-χρησιμοποίησαν. Υπήρξε έτσι, ο "Δώριος ή Δωρικός" τρόπος, ο "Λύδιος", ο "Φρύγιος" κ.ά. Οι Έλληνες του Πόντου ονομάζουν τις κλίμακες σκοπούς. Οι Άραβες ονομάζουν τις κλίμακες τους ως μακάμ και έτσι ακριβώς τις έλεγαν οι παλιοί Έλληνες μουσικοί, μέχρι τα πρώτα χρόνια που διαμορφώθηκε η έννοια του ρεμπέτικου τραγουδιού οπότε και οι κλίμακες άρχισαν να ονομάζονται με το ελληνικό, δρόμοι. Οι Βυζαντινοί ονόμαζαν τις δικές τους μουσικές κλίμακες ως ήχους και τις χώριζαν σε "κύριους ήχους" και "πλάγιους ήχους". Η ηχητική απόσταση ανάμεσα στον πρώτο και τον τελευταίο ήχο/νότα μιας οκτάφθογγης κλίμακας, ονομάζεται οκτάβα. Στην ευρωπαϊκή μουσική, το μικρότερο δομικό υλικό χτισίματος της μουσικής, η μικρότερη ηχητική απόσταση που μπορεί να έχουν δύο νότες μεταξύ τους, είναι το Ημιτόνιο. Για να γίνει αντιληπτή και οπτικά η απόσταση αυτή, αρκεί να κοιτάξουμε το πιάνο της εικόνας: Κάθε απόσταση ανάμεσα σε δύο λευκά που τα χωρίζει μαύρο πλήκτρο είναι ένας τόνος. Κάθε απόσταση ανάμεσα σε δύο λευκά πλήκτρα που δεν τα χωρίζει μαύρο πλήκτρο, είναι ένα ημιτόνιο. π.χ. ημιτόνιο είναι η απόσταση ανάμεσα στο Φα# και το Σολ, αλλά και η απόσταση ανάμεσα στα Μι και Φα. Είναι φανερό ότι μία οκτάβα (η απόστασή της επισημαίνεται και στην εικόνα) περιέχει 12 ημιτόνια, χρειάζονται δηλ. 12 ηχητικά βήματα για να καλύψουμε την απόσταση αυτή. 43