Komunikacja między dwoma aplikacjami na tym samym komputerze

0

Cześć,

słuchajcie, jak przekazać trochę danych (jednego stringa) między dwoma aplikacjami na tym samym komputerze? Obydwie aplikacje będą mojego "pióra" więc rozchodzi mi tylko o to jakiej technologii użyć?
Dane powinny być przekazywane w miarę online, system powinien być odporny na błędy związane z brakiem aplikacji docelowej.
Myślałem o komunikatach, socketach tcp czy lepiej UDP, plikach tekstowych (to najmniej mi się podoba).
Powinno to być lekkie, bo w końcu to prosta sprawa (niby).
Coś zasugerujecie?

8

Czy zawsze będą na tym samym kompie, czy jest później opcja rozdzielenia?
Czy będzie to zawsze 1:1 czy np. jest opcja jednego serwera i kilku klientów?
Jak długie będą te komunikaty?
Czy potrzebujesz potwierdzeń otrzymania/nic nie może się zgubić, czy jak jakiś komunikat przepadnie to nic się nie stanie?

5
cerrato napisał(a):

Czy zawsze będą na tym samym kompie, czy jest później opcja rozdzielenia?
Czy będzie to zawsze 1:1 czy np. jest opcja jednego serwera i kilku klientów?
Jak długie będą te komunikaty?
Czy potrzebujesz potwierdzeń otrzymania/nic nie może się zgubić, czy jak jakiś komunikat przepadnie to nic się nie stanie?

Brakło jeszcze pytania jaki system, bo jak linux/unix to mozna użyć Unix domain socket.
Z tak niewielnik opisam, to jakbym miał zaklepać na szybko komunikacje to użyłbym RESTa bo to znam najlepiej :P
Jakbym miał wiecej czasu to poczytałbym o ZeroMQ bo już dawno chciałem to przetestować. Chyba nawet jest jakiś binding dla pascala

3

Jeśli Windows - ja do tego używam komunikacji opartej na bazie WM_COPYDATA. Prościej się chyba nie da.

3

Jak komunikacja request response to HTTP. Jak komunikaty i trzymanie połączenia to websockety. Jak chcesz oba na raz i lubisz protobufy to gRPC. Tak czy owak: normalne rozwiązania, których używamy pomiędzy aplikacjami na różnych maszynach. Inne rozwiązania mają sens jak te trzy niedomagają wydajnościowo.

3

Jak Windows to moze stary dobry (bo wypróbowany) sposób https://docs.microsoft.com/en-us/windows/win32/memory/creating-named-shared-memory (w C++ ale nie ma żadnego problemu aby to zrobić w Delphi)
Oczywiście można użyć socketów (TCP/IP lub UDP nie żadne HTTP jak ktoś proponował) ale może wystąpić problem zajętych portów itp.
WM_COPYDATA - wymaga znalezienia uchwytu okna aplikacji co nie zawsze jest proste (np. FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna).

1

WM_COPYDATA - wymaga znalezienia uchwytu okna aplikacji co nie zawsze jest proste (np. FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna).

A czasem aplikacja nie ma okna dlatego warto sobie napisać prostą bibliotekę/komponent tworzący niewidoczne okno najlepiej nietypowej klasy (RegisterClass). To pozwala na połączenie nawet między aplikacjami konsolowymi.
Użycie socketów ma tą wadę że czasem burzą się firewalle. No i systemowy komunikat w zasadzie wymusza drugą aplikację działającą na tym samym systemie. Ma to tak samo wady jak i zalety, zależnie od potrzeb.

3

FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna

Ale po co masz zmieniać klasę, żeby dogrzebać się do uchwytu okna?

1
cerrato napisał(a):

FreePacal w odróżnieniu od Delphi zdaje sie nie bardzo pozwala na zmianę klasy okna

Ale po co masz zmieniać klasę, żeby dogrzebać się do uchwytu okna?

Aby mieć jakąś unikalną a nie standardowy TForm co pozwoli w bardziej pewny sposób znaleźć i pobrać uchwyt okna.

0

Precyzując:

  • aplikacja główna to POS,
  • drugi monitor to reklama (strona www) oraz pasek informacyjny (jak w drukarce fiskalnej),
  • obydwie aplikacje uruchomione zawsze na tym samym komputerze,
  • środowisko to Windows,

Przesyłany będzie string o długości 40 znaków, nic więcej. Nie potrzebuje żadnego potwierdzenia że doszedł. Program wysyłający nie może nawet kichnąć w trakcie wysyłki (czyli coś lekkiego) i musi być odporny na brak programu odbierającego.

Na teraz najbardziej jestem skłonny do UDP, prosta konfiguracja, odporność na brak serwera. Niby Indy ale już jest używane w programie wysyłającym do komunikacji z innym programem (już sieciowo).
REST-a też bardzo lubię.

Nie znałem WM_COPYDATA - już zerkam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1