Pomoc przy definicji binarywriter/binaryreader

0

Witam,
na początku zaznaczę, że nie jestem najlepszym programistą dlatego potrzebuje pomocy prawdopodobnie w prostej rzeczy mianowicie.
W moim programie mam kilka okien. Funkcja do logowania wygląda mniej więcej tak:

string login = textBox1.Text;
            string pass = textBox2.Text;            
            string uprawnienia="-1";
            try
            {

                TcpClient klient = new TcpClient(host, port);
                BinaryWriter writer = new BinaryWriter(klient.GetStream());
                BinaryReader reader = new BinaryReader(klient.GetStream());
                writer.Write(login);
                writer.Write(pass);                
                uprawnienia = reader.ReadString();            
                              
            }

Logowanie odbywa się po stronie serwera, który sprawdza w bazie danych czy dany użytkownik istnieje w bazie danych i czy hasło jest poprawne czy nie, a następnie po pozytywnej weryfikacji odsyła zmienna z poziomem logowania, od którego to zależy jakie opcje pojawią się w następnym oknie. Dodatkowo sesja z serwerem nie jest zamykana (ma to być serwer wielowątkowy)
Teraz mam problem z wysłaniem na serwer kolejnych informacji i nie bardzo wiem jak mam teraz w nowej formie zdefiniować klasę BinaryWriter tak bym mógł za jej pomocą wysłać nową wiad. Wyżej zastosowane rozwiązanie mija się z celem ponieważ połączenie z serwerem jest (teoretycznie) aktywne. Proszę o pomoc w poprawnym zdefiniowaniu poniższej funkcji. Błąd jaki mam to
"Element "System.IO.BinaryWriter.BinaryWriter()" jest niedostępny z powodu swojego poziomu ochrony."

 private void button2_Click(object sender, EventArgs e)
        {
            Kasowanie frm = new Kasowanie();
            frm.Show();
            string zadanie = Convert.ToString(2);
            BinaryWriter writer = new BinaryWriter();
           // writer.Write(zadanie);
        }
 

Może ktoś również mi doradzić może w jakiś inny sposób wykonywać wymianę danych z serwerem (czy utrzymywać połączenie i przełączać porty dla każdego nowego podłączonego klienta, czy lepiej, by każda wymiana danych z serwerem rozpoczynała się od nowego połączenia). Z góry dziękuje za pomoc.

0

Witaj,

trochę źle to rozumiesz. Po pierwsze wielowątkowy serwer, oparty o mnożenie obiektów typu Thread zajeździ Ci procesor już przy trzecim podłączonym kliencie. Najlepszym wyjściem jest zrobienie serwera i klienta na podstawie asynchronicznych socketów. Wtedy podczas podłączania się pierwszego klienta serwer rozpoczyna nasłuch oczekując na kolejnego.

Generalnie poczytaj o tych dwóch rzeczach, bo w komunikacji klient serwer asynchroniczne sockety są wyjściem najlepszym:
Serwer: https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
Klient: https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

Czysty multithreading jest niewydajny nawet jeżeli zastosujemy Threadpool. Jeżeli klient serwer to tylko asynchronicznie.
Możesz zrobić sobie klasę Serwer i Klient. Klasy te będą Singletonami, bo będziesz miał wtedy pewność, że nie będą mnożone ich instancje. Takie obiekty możesz swobodnie przekazywać wewnątrz klas GUI i pozyskiwać z nich dane, które są odbierane. Jak te dane pozyskiwać? Za pomocą wzorca obserwatora czyli implementacji interfejsu IObservable w klasach Serwer i Klient oraz interfejsu IObserver w klasie, która chce mieć dostęp do danych serwera.

Jest z tym trochę roboty ale innej drogi nie ma, bo komunikacji sieciowej wydajnej inaczej nie osiągniesz.

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