mimuw-jnp2-rust / project-szymon-lukasik-michal-molas

project-szymon-lukasik-michal-molas created by GitHub Classroom

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TagChat

Autorzy

  • Szymon Łukasik (gr 9, @SzymonLukasik na githubie)
  • Michał Molas (gr 9, @michal-molas na githubie)

Opis

Od zawsze chcieliśmy napisać aplikację do chatu.

Inspiracje

Z grubsza będziemy wzorować się na tym tutorialu https://www.youtube.com/watch?v=Iapc-qGTEBQ. Możliwe, że też na tym w szczegolności gdybyśmy chcieli P2P https://github.com/lemunozm/termchat.

Pracując nad pierwszą częścią inspirowaliśmy się przykładami:

Funkcjonalność

  • Możliwość tagowania fragmentów konwersacji, to mogłoby umożliwiać:
    • określanie tematyki fragmentu konwersacji
    • grupowanie fragmentów konwersacji po tagach
    • zwracanie wyników wyszukiwania pogrupowanych według tagów
  • Użycie współbieżności
  • Możliwość połączenia video i udostępniania ekranu

Propozycja podziału na części

W pierwszej części stworzymy prosty server i GUI, jeśli zdążymy z możliwośćią wyszukiwania. A w kolejnej dodamy współbieżność i połączenia video.

Część Pierwsza

W pierwszej części największą trudnością okazało się zintegrowanie GUI z kodem asynchronicznym. Do obsługi połączenia TCP wykorzystujemy bibliotekę tokio. Z początku, w celu połączenia egui z tokio inspirowaliśmy się sugestią twórcy biblioteki egui: emilk/egui#634 (comment) Próbowaliśmy użyć biblioteki poll-promise, aby w odpowiednich miejscach funkcji eframe::App::update, móc przesyłać lub pobierać informacje z serwera. Nie udało nam się jednak poprawnie zaimplementować tego pomysłu - każde podejście kończyło się błędem kompilacji. Ostatecznie zdecydowaliśmy się na zmianę architektury aplikacji - w konstruktorze TagChatApp tworzymy osobny wątek, który odpowiada za komunikację z serwerem i wykonuje działania asynchroniczne. Wątkek GUI i obsługujący komunikacje z serwerem komunikują się ze sobą za pomocą channeli.

Klient prowadzi konwersację ze wszystkimi innymi klientami podłączonymi do serwera. Klient umożliwia wyszukiwanie słów kluczowych w wiadomościach. Nie zaimplementowaliśmy możliwości tagowania fragmentów konwersacji oraz łączenia video.

W kolejnej części moglibyśmy na przykład dodać możliwość tagowania fragmentów konwersacji, rozwinąć aplikację o wspieranie kont, obsługę różnych konwersacji, łączenie video i zwiększyć wykorzystanie biblioteki tokio.

Biblioteki

  • tokio
  • egui
  • eframe (framework do egui)

Użytowanie

W poniższych poleceniach addr jest adresem IPv4 lub IPv6.

W celu uruchomienia serwera na porcie port:
cargo run --bin server -- -p port

W celu uruchomienia klienta z nazwą użytkownika user_name, jeśli server działa pod adresem addr na porcie port:
cargo run --bin client -- -s addr:port -n user_name

Przykład 1 - Serwer działa lokalnie na porcie 1234

W jednym terminalu:
cargo run --bin server -- -p 1234

W dwóch terminalach:
cargo run --bin client -- -s localhost:1234 user_name

Przykład 2 - Serwer działa na students na porcie 1234

W terminalu na students:
cargo run --bin server -- -p 1234

W dwóch terminalach lokalnie:
cargo run --bin client -- s students.mimuw.edu.pl:1234 -n user_name

About

project-szymon-lukasik-michal-molas created by GitHub Classroom


Languages

Language:Rust 82.7%Language:Shell 9.6%Language:Batchfile 7.7%