Widziałem wiele zasobów tutaj na SO o gniazdach. Sądzę, że żadne z nich nie zawierało szczegółów, które chciałem poznać. W mojej aplikacji serwer wykonuje całe przetwarzanie i wysyła okresowe aktualizacje do klientów.Pierwsze kroki z programowaniem gniazd w języku C# - Najlepsze praktyki
Celem tego wpisu jest omówienie podstawowych pojęć wymaganych przy opracowywaniu aplikacji gniazd i omówienie najlepszych praktyk. Oto podstawowe rzeczy, które można zobaczyć w przypadku prawie wszystkich aplikacji opartych na gniazdach.
1 - Binding i słuchać na gnieździe
Używam następujący kod. Działa dobrze na moim komputerze. Czy muszę dbać o coś innego, kiedy wdrażam to na prawdziwym serwerze?
IPHostEntry localHost = Dns.GetHostEntry(Dns.GetHostName());
IPEndPoint endPoint = new IPEndPoint(localHost.AddressList[0], 4444);
serverSocket = new Socket(endPoint.AddressFamily, SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(endPoint);
serverSocket.Listen(10);
2 - odbieranie danych
I stosuje się tablicę wielkości 255 bajtów. Więc gdy otrzymuję dane, które mają więcej niż 255 bajtów, muszę wywołać metodę odbierania, dopóki nie otrzymam pełnych danych, prawda? Gdy otrzymam pełne dane, muszę dołączyć wszystkie otrzymane bajty, aby uzyskać pełny komunikat. Czy to jest poprawne? Czy istnieje lepsze podejście?
3 - Wysyłanie danych i określania długości danych
Ponieważ nie ma sposobu, aby znaleźć w sieci TCP długość wiadomości otrzymywać, Mam zamiar dodać długości do wiadomości. Będzie to pierwszy bajt pakietu. Zatem systemy klienckie wiedzą, ile danych można odczytać.
Jakieś inne lepsze podejście?
4 - Zamykanie klienta
Kiedy klient jest zamknięty, to wyśle wiadomość do serwera wskazuje na ścisły. Serwer usunie szczegóły klienta z jego listy klientów. Poniżej przedstawiono kod używany po stronie klienta do odłączenia gniazda (część komunikatu nie jest pokazana).
client.Shutdown(SocketShutdown.Both);
client.Close();
Wszelkie sugestie lub problemy?
5 - zamknięcie serwera
serwer wysyła wiadomość do wszystkich klientów wskazującymi wyłączył. Każdy klient rozłączy gniazdo po otrzymaniu tego komunikatu. Klienci wyślą zamkniętą wiadomość do serwera i zamkną. Gdy serwer otrzyma komunikat zamknięcia od wszystkich klientów, odłącza gniazdo i przestaje nasłuchiwać. Zadzwoń pod numer Na każdym gniazdu klienta usuń numer, aby zwolnić zasoby. Czy to właściwe podejście?
6 - nieznany rozłączenia klienta
Zdarza się, że klient może odłączyć bez informowania serwer. Mój plan poradzenia sobie z tym to: Kiedy serwer wysyła wiadomości do wszystkich klientów, sprawdź stan gniazda. Jeśli nie jest podłączony, usuń tego klienta z listy klientów i zamknij gniazdo dla tego klienta.
Każda pomoc będzie świetna!
miałem problemy z IPaddress nasłuchuje na jakiejś starszej wersji systemu Windows. Używanie IPAddress ipAddress = new IPAddress (new byte [] {0, 0, 0, 0}); wydaje się być najlepszy dla mnie! – clamchoda