Windows Forms/Windows Service

0

Witam. Muszę zrobić dwa okna windows forms i jedno okno windows service. Korzystam z komunikacji : https://stackoverflow.com/questions/10182751/server-client-send-receive-simple-text miedzy windows formem a windows service a nastepnie do drugiego okna windows forms. Wysyłam informacje z jednego textboxa win form do listy na drugim win form. Problem jest w tym, że funkcja do wysyłania danych, działa tylko raz i w momencie jeżeli chciałbym z tego samego okna wysłać drugą wiadomość to ta wiadomość już nie dojdzie do listy na drugim win forms. Jest jakiś ciekawy sposób aby funkcja int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize) wykonywała się automatycznie bez ingerencji żadnego buttona kliknietego na drugim oknie?
Dane mają przepływać płynnie bez ingerencji żadnego buttona, więc wsadzanie tego w jakieś konstruktory lub inne onClicki odpada.

0

Wrzuć gdzieś Twój projekt, będzie łatwiej zrozumieć o co chodzi...

ps. Co ma windowsserver do Twojego tematu?

0

https://pastebin.com/kB0D9xCC server
https://pastebin.com/5sum990z client1
https://pastebin.com/UGskaaXa client 2

Idea tego zadania jest taka, że wysyłamy clientem 1 info z textboxa do windows service, windows service odbiera i wysyła wiadomość do clienta2. Na tą chwilę to działa, ale tylko 1 raz( kod do odbioru jest w konstruktorze(wiem tak to nie powinno wygladać, ale nie mogę zrobić żadnego buttona, tylko z automatu wiadomość ma być dostarczona do clienta2) w momencie jak próbuje wysłać 2 raz wiadomość z clienta 1 do clienta 2 ta wiadomość już nie dochodzi). Jak można to poprawić żeby wysłać dowolną liczbę wiadomości ???

Z góry dzięki za pomoc

0

Poczytaj, ile urządzeń może nasłuchiwać na jednym porcie a potem użyj try() catch(). Wyjątek, który Ci się pojawi jest bardzo dokładnie opisany i wtedy nie będziesz miał cienia wątpliwości co jest nie tak.

screenshot-20200123142716.png

Twoi klienci powinni też mieć możliwość nasłuchiwania. Masz zadeklarowane

TcpListener listener

ale nigdy go nie używasz. Twoi klienci nie nasłuchują wcale prób połączenia od "serwisu". Więc mogą jedynie do niego wysyłać wiadomości i oczekiwać, że serwer zwróci im jakąś wiadomość po czym połączenie zostaje zamknięte.

następny błąd:

Thread t = new Thread(() =>
            {
                client = listener.AcceptTcpClient();
 
                nwStream = client.GetStream();
                byte[] buffer = new byte[client.ReceiveBufferSize];
 
                int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
 
                //send back message
                client = new TcpClient(SERVER_IP, 8001);
                nwStream = client.GetStream();
                nwStream.Write(buffer, 0, bytesRead);
 
                nwStream.Close();
                client.Close();
 
            });

Akcja wykonuje się tylko raz:

  1. Oczekujesz na klienta
 listener.AcceptTcpClient();
  1. Czytasz dane
  2. Zamykasz połączenie i wychodzisz.
client.Close();

Powinieneś całą procedurę oczekiwania na klienta umieścić w pętli.

bool AcceptNewClients = true;
while(AcceptNewClients)
{
     client = listener.AcceptTcpClient();
     DoSome(client);
}
private static void DoSome(TcpClient client)
{
}

Teraz jak zakończysz jedno połączenie, wywoła się ponownie metoda: listener.AcceptTcpClient() i możliwe będzie kolejne połączenie

=========
Pamiętaj, jeżeli nie rozumiesz jak coś działa czytaj dokumentację, na msdn są nawet gotowe przykłady i błędy jakie można napotkać

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