Hey there 👋🏻
marcel-baur / rust-project Goto Github PK
View Code? Open in Web Editor NEWLicense: Other
License: Other
Hey there 👋🏻
Sie machen bis auf eine Zeile im Code dasselbe
Wenn jemand das Netzwerk verlassen, will müssen ein paar Dinge passieren:
Analoges Vorgehen wie beim Herunterladen von einem File
Jeder Peer weiß wo die Kopie von jedem File liegt das er selber speichert. Falls dann ein Peer rausfliegt kann mit diesem Log die Redundanz einfach wiederhergestellt werden.
Aktuell benötigen wir zwei Argumente: own-name
(required) und ip-address
(optional).
Jeder Client ist selber ein Peer im Netzwerk.
Jeder Peer benötigt eine Tabelle mit den anderen Peers als Inhalt (Netzwerktabelle).
Map<own-name, network-ip>
Zwei Optionen:
create(own-name)
join(own-name, network-ip)
Erstellt ein neues Netzerk. Muss dann auch fähig sein neue Peers zu akzeptieren. Erstellt damit die initiale Tabelle von Peers, wo er nur selber drin steht.
Schließt sich einem Netzwerk an, entsprechend der übergebenen network-id
.
Wenn das passiert muss der neue Peer von einem bereits bestehenden Peer die Netzwerktabelle erhalten. Diese muss auch mit den Informationen des neuen Peers aktualisiert werden. Dabei muss sichergestellt werden dass der Name des neuen Netzwerks own-name
noch nicht existiert. Andere Peers müssen vom neuen Peer mitbekommen und ihre Netzwerktabellen auch aktualisieren
Letztendlich ja doch nicht, nachdem wir nur noch den lokalen Stand der Datenbank anzeigen wollen?
Schnittstelle klar definieren und vom Rest abkapseln
unwrap()
entfernen
Das mit den Schnittstellen machen wir am einfachsten wenn wir schon mit dem Projekt fertig sind und wissen welche Funktionen wir brauchen. Nur die sind dann nach außen hin zugänglich.
Die Shell muss ein eigenes Programm sein welches die Library implementiert (#31)
Hab einen generischen Typ für Responses erstellt, ist aber noch auf meinem Branch
RemoteNotification
für Nachrichten an andere Peers, SelfNotification
für Shell -> Listener
Wenn man das Programm mit der Aufforderung cargo run xD 6969 123.56.89.87:1337
schaut es so aus als ob man einem Netzwerk beigetreten ist. Alle Programmeingaben bleiben unbeantwortet.
Key Value:
Songname - Künstler
Rückgabe als (Websocket?) Stream.
Wie verteilen wir die DB? Peer2Peer, Redundancy beachten: Jedes File sollte auf mindestens 2 Peers sein.
Basis-Funktionen:
get(Filename)
-> Gibt das mp3 file zurück
stream(filename)
-> Streamt das mp3
push(filename, file)
Unser Programm läuft mit mehreren Threads. Von einer der Threads (Interaction
) werden Einträge in unsere Datenbank (die ja eine HashMap
ist) geschrieben. Das Problem ist dass Referenzen nicht ohne weiteres in Threads übergeben werden dürfen. Hat auch gute Gründe, unter anderem dass ja mehrere Threads "gleichzeitig" etwas an der HashMap
ändern könnten, was zu unvorhersehbaren Fehlern führen kann (zweimal der gleiche key
z.B.).
Ich hab mich etwas auf StackExchange umgesehen um zu schauen wie man das lösen kann. Mit etwas hacken kann man das evtl. umgehen, kann aber sehr gut sein dass das in der Bewertung schlecht ankommt.
Do not communicate by sharing memory; instead, share memory by communicating. Wir ändern nicht direkt die HashMap
, sondern senden einen Request nach außen um die Datenbank aktuell zu halten. Dieser kann auch zurückgewiesen werden falls etwas nicht passt, doppelte key
s zum Beispiel. Letztendlich müssen wir das sowieso mit den Tabellen der anderen Peers abgleichen.
Beim konvertieren vom value -> String
Eventuell ein Notification System für Kommunikation innerhalb der Threads? Wenn das natürlich so easy ist 😅
Müsste auf jeden Fall im ConThread bzw Mainthread gestartet werden.
Bugs:
Heartbeat/DroppedPeer nicht an sich selber senden
Im moment löuft die Musik weiter, wenn sie aus der Datenbank gelöscht wurde. Die Musik sollte am besten gestoppt werden wenn man die löscht.
Momentan ist es nur für macOS implementiert. Muss auf jeden fall auch für Linux gehen, bestenfalls auch für Windows. Siehe u.A. create_network()
Funktion
Welche Files gibt es etc
Sich einem Netzwerk anschließen
Schließt sich einem Netzwerk an, entsprechend der übergebenen network-id.
Wenn das passiert muss der neue Peer von einem bereits bestehenden Peer die Netzwerktabelle erhalten. Diese muss auch mit den Informationen des neuen Peers aktualisiert werden. Dabei muss sichergestellt werden dass der Name des neuen Netzwerks own-name noch nicht existiert. Andere Peers müssen vom neuen Peer mitbekommen und ihre Netzwerktabellen auch aktualisieren
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.