Witam,

przychodzę tutaj do was szukać wskazówek i pomocy w następującym problemie:

  • Mam obiekt pakiet (współdzielony w bibliotece *.dll)
  • Mam metody obsługi tego obiektu (współdzielone w tej samej *.dll)
  • Jest sobie serwer i jest sobie klient.
  • Klient Serializuje Pakiet i wysyła socketem do Serwera.
  • Serwer odbiera i deserializuje pakiet. Następnie ten sam Pakiet bierze i Serializuje po czym odsyła do klienta.

Problem w tym, że przy deserializacji po stronie klienta dostaję błąd:
"The input stream is not a valid binary format. The starting contents in bytes are:
<Tutaj ciąg bitów>"

Ponieważ w stronę Serwera działa to prawidłowo, a w stronę klienta już nie (deserializacja wykorzystuje tą samą metodę i obiekt) to nie bardzo wiem co jest tutaj nie tak.
Prosiłbym o jakąś wskazówkę. Z góry dziękuję za poświęcony czas pod spodem kod.

Klasa Pakietu

[Serializable]
    public class Pakiet
    {
        #region NIE DOTYKAC - ALBO ZROBIC KOPIE :)
        [NonSerialized]
        public System.Net.Sockets.Socket Gniazdo;
        public int NumerKlienta;
        [NonSerialized]
        public byte[] BuforDanych = new byte[1024];
        public Pakiet(System.Net.Sockets.Socket gniazdo, int numerKlienta)
        {
            Gniazdo = gniazdo;
            NumerKlienta = numerKlienta;
        }
        public Pakiet()
        {
        }
        #endregion
        #region Motocykl - Tutaj mozna grzebac
        public string Nazwa;
        public Orientacja Kierunek;
        public Point Lokalizacja;
        public Color Kolor;
        #endregion
    }

Metody Rozszerzające Klasę Pakiet (Serializacja i DeSerializacja)

    public static class ObslugaPakietu
    {
        public static byte[] Serializuj(this Pakiet P)
        {
            BinaryFormatter BinFormat = new BinaryFormatter();
            MemoryStream MemStream = new MemoryStream();
            BinFormat.Serialize(MemStream, P);
            return MemStream.GetBuffer();
        }
        public static Pakiet deSerializuj(this Pakiet P)
        {
            try
            {
                byte[] BuforDanych = P.BuforDanych.ToArray();
                BinaryFormatter BinFormat = new BinaryFormatter();
                MemoryStream MemStream = new MemoryStream();
                MemStream.Write(BuforDanych, 0, BuforDanych.Length);
                MemStream.Seek(0, 0);
                return (Pakiet)BinFormat.Deserialize(MemStream);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
                return null;
            }
        }
    }

KOD Klienta

    public class KlientSieci
    {
        byte[] BuforDanych = new byte[10];
        IAsyncResult Wynik;
        public AsyncCallback ZawyolanieZwrotne;
        public Socket Gniazdo;
        public IPAddress MojeIP;
        public IPAddress SerwerIP;
        public KlientSieci()
        {
            MojeIP = LokalneIP();
        }
        public void Zamknij()
        {
            if (Gniazdo != null)
            {
                Gniazdo.Close();
                Gniazdo = null;
            }
        }
        public void Polacz(IPAddress AdresIP, int Port)
        {
            try
            {
                // Tworzymy nowa instancje Gniazda
                Gniazdo = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // Tworzymy EndPoint > Punkt Zaczepienia/Koncowy
                IPEndPoint ipEnd = new IPEndPoint(AdresIP, Port);
                // Laczymy sie z Swerwerem
                Gniazdo.Connect(ipEnd);
                if (Gniazdo.Connected)
                {
                    //Asynchroniczne oczekiwanie na dane
                    CzekajNaDane();
                }
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void Wyslij(Pakiet P)
        {
            try
            {
                if (Gniazdo != null)
                {
                    byte[] DaneBin = P.Serializuj();
                    Gniazdo.Send(DaneBin);
                }
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void CzekajNaDane()
        {
            try
            {
                if (ZawyolanieZwrotne == null)
                {
                    ZawyolanieZwrotne = new AsyncCallback(DaneOdebrane);
                }
                Pakiet P = new Pakiet();
                P.Gniazdo = Gniazdo;
                // Asynchroniczny Nasluch Danych
                Wynik = Gniazdo.BeginReceive(P.BuforDanych,0, P.BuforDanych.Length,SocketFlags.None,ZawyolanieZwrotne,P);
            }
            catch (SocketException E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void DaneOdebrane(IAsyncResult wynik)
        {
            try
            {
                Pakiet P = (Pakiet)wynik.AsyncState;
                Pakiet Odebrany = P.deSerializuj();
                System.String Dane = Odebrany.Nazwa + "\n<" + Odebrany.Lokalizacja.X+";"+Odebrany.Lokalizacja.Y+">\n";
                Console.Out.WriteLine(P.ToString() + "\n");
                CzekajNaDane();
            }
            catch (SocketException E)
            {
                MessageBox.Show(E.ErrorCode.ToString());
            }
        }
        public void Rozlacz()
        {
            if (Gniazdo != null)
            {
                Gniazdo.Close();
                Gniazdo = null;
            }
        }
        public IPAddress LokalneIP()
        {
            String NazwaHosta = Dns.GetHostName();
            IPHostEntry Wejscie = Dns.GetHostEntry(NazwaHosta);
            
            foreach (IPAddress adresip in Wejscie.AddressList)
            {
                return adresip;
            }
            return IPAddress.Loopback;
        }
    }

KOD Serwera


public class SerwerSieci
    {
        public AsyncCallback ZawolanieZwrotne;
        private Socket Gniazdo;
        private ArrayList ListaKlientow = ArrayList.Synchronized(new ArrayList());
        private int IloscKlientow = 0;
        private IPAddress AdresIP;
        public SerwerSieci()
        {
            AdresIP = GetIP();
        }
        public void Nasluchuj(IPAddress AdresIP, int Port)
        {
            try
            {
                Gniazdo = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                IPEndPoint LokalnyPunkt = new IPEndPoint(IPAddress.Any, Port);
                Gniazdo.Bind(LokalnyPunkt);
                Gniazdo.Listen(4);
                Gniazdo.BeginAccept(new AsyncCallback(PolczonoKlienta), null);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void PolczonoKlienta(IAsyncResult wynik)
        {
            try
            {
                Socket gniazdo = Gniazdo.EndAccept(wynik);
                Interlocked.Increment(ref IloscKlientow);
                ListaKlientow.Add(gniazdo);
                string msg = "<SERWER>[Witaj Kliencie" + IloscKlientow + "\n]";
                WyslijDoKlienta(msg, IloscKlientow);
                OczekujNaDane(gniazdo, IloscKlientow);
                Gniazdo.BeginAccept(new AsyncCallback(PolczonoKlienta), null);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void OczekujNaDane(Socket gniazdo, int numerKlienta)
        {
            try
            {
                if (ZawolanieZwrotne == null)
                {
                    ZawolanieZwrotne = new AsyncCallback(DanePrzyjete);
                }
                Pakiet P = new Pakiet(gniazdo, numerKlienta);
                gniazdo.BeginReceive(P.BuforDanych, 0,P.BuforDanych.Length,SocketFlags.None,ZawolanieZwrotne,P);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void DanePrzyjete(IAsyncResult wynik)
        {
            Pakiet P = (Pakiet)wynik.AsyncState;
            try
            {
                Pakiet Odebrany = P.deSerializuj();       
                Wyslij(Odebrany);
                OczekujNaDane(P.Gniazdo, P.NumerKlienta);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public void Wyslij(Pakiet P)
        {
            try
            {
                Socket gniazdo = null;
                for (int i = 0; i < ListaKlientow.Count; i++)
                {
                    gniazdo = (Socket)ListaKlientow[i];
                    if (gniazdo != null)
                    {
                        if (gniazdo.Connected)
                        {
                            byte[] DaneBin = P.Serializuj();
                            gniazdo.Send(DaneBin);
                        }
                    }
                }
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
        public IPAddress GetIP()
        {
            String NazwaHosta = Dns.GetHostName();
            IPHostEntry WejscieHosta = Dns.GetHostEntry(NazwaHosta);
            foreach (IPAddress adresip in WejscieHosta.AddressList)
            {
                return adresip;
            }
            return IPAddress.Loopback;
        }
        public void Zamknij()
        {
            if (Gniazdo != null)
            {
                Gniazdo.Close();
            }
            Socket gniazdo = null;
            for (int i = 0; i < ListaKlientow.Count; i++)
            {
                gniazdo = (Socket)ListaKlientow[i];
                if (gniazdo != null)
                {
                    gniazdo.Close();
                    gniazdo = null;
                }
            }
        }
        public void WyslijDoKlienta(string Wiadomosc, int NumerKlienta)
        {
            byte[] DaneBin = System.Text.Encoding.ASCII.GetBytes(Wiadomosc);

            Socket gniazdo = (Socket)ListaKlientow[NumerKlienta - 1];
            gniazdo.Send(DaneBin);
        }
    }