C# Client/Server Verbindung schliesst einfach so

  • C#
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von pferdefleisch.

    C# Client/Server Verbindung schliesst einfach so

    Hallo Community,
    Bei meinen 2D Shooter(MonoGame) verwende ich meine Netzwerk Lib zum senden/empfangen von Strings/vectoren etc
    Nach einiger Zeit trennt die Verbindung beim Server/Client und mir wird ein Fehler am Kopf geworden(IOException Verbindung bereits getrennt blablabla) bei

    StringPacket incomingPacket = new StringPacket();
    incomingPacket.TransformFromString(nreader.ReadLine());
    if (incomingPacket.getName() == "SPAWN")
    {
    string playerName = incomingPacket.ReadString("Username");
    MPPlayer mp = new MPPlayer(playerName, this);
    mpplayers.Add(mp);
    }
    if (incomingPacket.getName() == "SPAWN_BULLET_CL")
    {
    Vector2D SDIR = incomingPacket.ReadVector2D("direction");
    Vector2D SPOS = incomingPacket.ReadVector2D("position");
    Vector2 dir = new Vector2((float)SDIR.X, (float)SDIR.Y);
    Vector2 pos = new Vector2((float)SPOS.X, (float)SPOS.Y);
    Bullet bu = new Bullet((float)incomingPacket.ReadDouble("force"), dir, incomingPacket.ReadString("name"), pos, this, (float)incomingPacket.ReadDouble("rotation"));
    spawnBulletClientside(bu);
    }

    Kurze Erklärung von StringPacket
    Dictionary<string,object> wird serialisiert und als ByteArray als String(base64) konvertiert bzw umgekehrt.
    Funktioniert perfekt aber irgendwie bugt da was beim TcpClient/TcpListener rum bzw StreamReader/StreamWriter.

    Mfg Pferdefleisch
    Du schreibst du hast ein Problem beim TcpClient oder Listener dein CodeBeispiel zeigt aber nicht wie du Daten versendest sondern irgendwas.
    So kann dir wahrscheinlich keiner weiter helfen.
    Das ist meine Signatur und sie wird wunderbar sein!
    Hier die Contents Klasse:

    C#-Quellcode

    1. [Serializable]
    2. [PercentageComplete(100)]
    3. [Developer("KonradSoft(Konrad Schumann)")]
    4. public class Contents : Dictionary<string, object>,IFormattable,ISerializable
    5. {
    6. public Contents()
    7. : base() { }
    8. public Contents(SerializationInfo info, StreamingContext context)
    9. : base(info, context) { }
    10. public string ToString(string format, IFormatProvider formatProvider)
    11. {
    12. return "";
    13. }
    14. }


    Hier die StringPacket Klasse (Write & Read methoden herausgenommen da nur Contents.Add(key,value) und return Contents[key];

    C#-Quellcode

    1. public StringPacket() { packet = new Contents(); }
    2. private byte[] Write(Contents dictionary)
    3. {
    4. MemoryStream stream = new MemoryStream();
    5. BinaryFormatter bFormatter = new BinaryFormatter();
    6. bFormatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
    7. bFormatter.Serialize(stream, dictionary);
    8. stream.Position = 0;
    9. byte[] buffer = new byte[stream.Length];
    10. for (int i = 0; i < stream.Length; i++)
    11. {
    12. buffer[i] = (byte)stream.ReadByte();
    13. }
    14. stream.Dispose();
    15. stream.Close();
    16. return buffer;
    17. }
    18. public override string ConvertToString()
    19. {
    20. return System.Convert.ToBase64String(Write(packet));
    21. }
    22. public override void TransformFromString(string values)
    23. {
    24. packet = Read(System.Convert.FromBase64String(values));
    25. }
    26. public override byte[] Send()
    27. {
    28. return Write(packet);
    29. }
    30. public override void Transform(byte[] values)
    31. {
    32. packet = Read(values);
    33. }
    34. private Contents Read(byte[] values)
    35. {
    36. MemoryStream stream = new MemoryStream();
    37. stream.Write(values, 0, values.Length);
    38. stream.Position = 0;
    39. BinaryFormatter bFormatter = new BinaryFormatter();
    40. bFormatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full;
    41. Contents data = (Contents)bFormatter.Deserialize(stream);
    42. return data;
    43. }


    und so sende ich bzw empfange ich:

    C#-Quellcode

    1. nwriter = new StreamWriter(client.GetStream());
    2. nreader = new StreamReader(client.GetStream());
    3. userN = "User" + Basic.getM();
    4. StringPacket welcomePacket = new StringPacket();
    5. welcomePacket.setPackageHeader(PackageUID.LOGIN, "Login");
    6. welcomePacket.WriteString("Username", userN);
    7. nwriter.WriteLine(welcomePacket.ConvertToString());
    8. nwriter.Flush();
    9. StringPacket serverInfoPacket = new StringPacket();
    10. serverInfoPacket.setPackageHeader(PackageUID.PING, "ServerInfo");
    11. serverInfoPacket.TransformFromString(nreader.ReadLine());
    12. effect = new BasicEffect(Basic.spriteBatch.GraphicsDevice);
    13. tileWorld = TileWorldConverter.StringtoTileMap(serverInfoPacket.ReadString("World"));
    14. player = new Player(tileWorld, this);
    15. player.setUsername(userN);
    16. new Thread(serverSync).Start();


    EDIT: Das alles läuft super Performant dank Threading und LOW-LEVEL Packeten(niemals mehr als 8 Werte in einem Packet)