wenn ihr mal ein lanfähiges Spiel oderso programmieren wollt und noch nicht genau wisst, wie die Kommunikation zwischen Client und Server oder zwischen Client und Client ablaufen soll, dann könnt ihr euch ja mal meinen ersten Versuch dafür anschaun
Ist Teil eines Spiels, ich hab mal ein paar Packets als Beispiel dort gelassen.
Errzeugen eines PacketStreams:
Code:
PacketStream.Create( <IPEndPoint / TcpClient> ) oder new PacketStream( <IPEndPoint / TcpClient> )
Code:
var packetStream = new PacketStream(sampleTcpClient) if(!packetStream.Connected) packetStream.Connect(); packetStream.WritePacket( <SomeClassInerhitsFromPacketBase> )
Lesen:
Code:
packetStream.ReadPacket();
Definieren eines Packets:
Code:
using PacketStreamLib.GameStream.Packets.Answer.Interface; using PacketStreamLib.GameStream.Packets.Attribute; using PacketStreamLib.GameStream.Packets.Base; using PacketStreamLib.GameStream.Packets.Enum; namespace PacketStreamLib.GameStream.Packets.Answer { public class EntityCreatedPacket : PacketBase, IAmAnswer { public override PacketType PacketType { get { return Enum.PacketType.EntityCreated; } } [PropertyIndex(0)] public override string PacketGuid { get; set; } [PropertyIndex(1)] public string RequestPacketGuid { get; set; } [PropertyIndex(2)] public string EntityGuid { get; set; } } }
Alles Packets erben von PacketBase.
IAmAnswer definiert eine Antwort auf ein Packet, welches IAmRequest implementiert.
PacketType gibt den Typ an und wird aus PacketBase überschrieben. Darüber kann man auch das Ergebnis von ReadPacket ermitteln und casten.
Damit das Packet gelesen werden kann, müsst ihr nur bei ReadPacket ein case einbauen:
Code:
public PacketBase ReadPacket() { var packetTypeInt = new byte[sizeof (int)]; _networkStream.Read( packetTypeInt, 0, sizeof (int) ); var packetType = (PacketType) BitConverter.ToInt32( packetTypeInt, 0 ); switch (packetType) { case PacketType.LoginPacket: return new LoginPacket().Read( _networkStream ); case PacketType.EntityAttacked: return new EntityAttackedPacket().Read( _networkStream ); case PacketType.EntityCreated: return new EntityCreatedPacket().Read( _networkStream ); [TOADD] case PacketType.<Euer PacketType>: return new EuerNeuesPacket().Read( _networkStream ); [/TOADD] default: throw new NotImplementedException(); } }
und den neuen Enum Member für den PacketType anlegen:
Code:
public enum PacketType { None = 0, <YourNewPacketType> = 1,