Komunikacja sieciowa, wysyłanie i odbieranie w osobych wątkach

0

Chciałbym zrealizować coś takiego aby wysyłać i odbierać wiadomości w osobnych wątkach.
Mam 2 klasy + korzystam z jakieś tam zamkniętej, która obsługuje komunikację po sieci.

Klasa Kliencka (wysyłanie + odbiór odpowiedzi) i Serwerowa (odebranie od klienta, odpowiedź do klienta).
Teraz mam tak, że mam w klasie klienckiej zrealizowane wszystko w jednej metodzie, wysyłanie i odbiór (wysyłam i czekam na odpowiedź). Chciałbym to rozdzielić na dwa wątki.
Tworzę sobie obiekt klasy obsługującej komunikację sieciową w metodzie send_data;

class Client{

....

void send_data(){
            TCPKlient object (port, IP);
            ....
            object.send(....);
}


void receive_data(){
             //no i w tym miejscu chciałbym skorzystać z obiektu utworzonego wcześniej i czekać na dane przychodzące
}

};

I teraz pojawia się pytanie w jaki sposób mogę utrzymać ten obiekt cały czas jeżeli np. kończę metodę wysyłania danych i chcę zakończyć ten wątek i przejść do oczekiwania na dane przysłane od serwera czyli odbiór, tak żeby nie zarzucić tej komunikacji tylko cały czas ją utrzymać i żeby serwer wiedział, gdzie ma to przesłać?

0

nie wiem czy dobrze zrozumiałem, ale może takie rozwiązanie jest dla Ciebie satysfakcjonujące?

class Client 
{
std::shared_ptr<std::thread> th;
...
void send_data(){
  th = std::make_shared<std::thread>([this] {
    TCPKlient object (port, IP);
    object.send(....);
    // wait for data
    receive_data(object);
  });
}

void receive_data(const TCPKlient& object)
{
  // do sth. with object...
}
};
0

Dzięki @Loganek o coś takiego mi właśnie chodziło!

1

chyba wcale Ci o to nie chodziło, to wygląda strasznie słabo, no chyba że to jest webservice

edit:
powinieneś zaprogramować klasy client server i odbierać asynchronicznie wiadomości;

te obiekty powinny żyć przez cały czas (mówimy o zwykłym połączeniu socketowym)

0

Mam klasy Klient i Serwer. Chciałbym natomiast rozdzielić te metody. Jeżeli w metodzie wysyłającej (klasa Klient) tworzę sobie obiekt klasy TCPKlient (jakaś zewnętrzna biblioteka do obsługi socketów) i ta metoda (sendData() - moja metoda zaimplementowana w klasie Klient) się kończy bo wysłała już dane to chcę ten obiekt utrzymać cały czas przeskakując do metody odbiorczej (receiveData() - także moja metoda w klasie Klient, która jest osobną), tak by serwer komunikował się z tym obiektem (TCPKlient) cały czas, na ustalonym porcie, gdy sendData() już się zakończy i może słać kolejne wiadomości. Po stronie serwera oczywiście tworzę obiekt, który cały czas żyje i oczekuje na dane i odpowiada.
Metody sendData() i receiveData() wywołuję asynchronicznie.
Nie wiem czy nie zrobił się troche miszmasz.

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