Pakiety danych (własny komunikator) - czy tak jest dobrze?

0

Witam. Pisząc własny komunikator (w C#) tak już bardziej na poważnie z początku odczytywałem sobie tak byle jak ze strumienia sieciowego, ale teraz przydałoby się jakoś w miarę fachowo to napisać, mianowicie wysyłanie i odbieranie pakietów. Na razie robię tak:

        private string Read(TcpClient client)
        {
            // Tak robiłem wcześniej (dł. pakietu max 255, stąd 1 bajt odbieram):
            //client.GetStream().ReadTimeout = ReadTimeout;
            //byte[] data = new byte[client.GetStream().];
            //client.GetStream().Read(data, 0, data.Length);
            //return UTF8Encoding.UTF8.GetString(data);

            // teraz zrobiłem dł. pakietu max 65535 (stąd 2 bajty odbieram)
            client.GetStream().ReadTimeout = ReadTimeout;
            short length = BitConverter.ToInt16(
                new byte[2] { (byte)client.GetStream().ReadByte(), (byte)client.GetStream().ReadByte() }, 0);
            byte[] data = new byte[length];
            client.GetStream().Read(data, 0, length);
            return UTF8Encoding.UTF8.GetString(data);

        }
        private void Send(TcpClient client, string value)
        {
            //byte[] data = UTF8Encoding.UTF8.GetBytes(value);
            //client.GetStream().WriteByte((byte)data.Length);
            //client.GetStream().Write(data, 0, data.Length);

            client.GetStream().WriteTimeout = WriteTimeout;
            short length = (short)UTF8Encoding.UTF8.GetByteCount(value);
            client.GetStream().Write(BitConverter.GetBytes(length), 0, 2);
            byte[] data = UTF8Encoding.UTF8.GetBytes(value);
            Array.Resize<byte>(ref data, length);
            client.GetStream().Write(data, 0, length);
        }

Czy takie odb. i wys. może być czy jakoś to ładniej da się zrobić? Prosił bym o Wasze zdania.

1

pierwsza rzecz która się rzuca w oko, to zapisz sobie ten stream do osobnej zmiennej, żebyś nie robil ciągle client.GetStream()

0

Trochę struktura programu mi na to nie pozwala, ale mogę zamiast TcpClient przekazać sam strumień, bo jego tylko używam.

1

Może wygodniej by się wysyłało\odbierało dane (np. stringi) przy pomocy BinaryWriter \ BinaryReader ? Nie musiałbyś wtedy bawić się z buforami i liczeniem długości danych.

0

Czy w BW po zapisaniu dwóch stringów tj. np. login i zaraz po tym hasło, w readerze odbierze mi oddzielnie? Czytałem na MSDN, napisane jest, że string poprzedza długość jego, więc reader wie ile ma zczytać - jeżeli działa prawie jak bufory, to faktycznie zmienię na Binary. W sumie to chyba tyle w tym temacie. Przy binary r/w będzie czytelniej i chyba lepiej się tego zrobić nie da ;p Dzięki.

Komu teraz zaakceptować odpowiedź? :P

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