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);
}
}