#1 19. September 2013 Hi, ein paar Kollegen und ich sind grad dabei, ein multiplayerspiel zu erstellen (in C#). Wir wollen das nicht mit dem Unity Masterserver machen und haben uns deshalb einen Telnet Server eingerichtet. das Anmelden eines Gerätes beim Server funktioniert bereits. auch das senden der Positionsdaten. Das Ganze findet mit JSON statt. jedoch haben wir nur ein Problem. wenn wir die Position eines Spielers nun jeden Frame senden, dann kommt das Zielgerät mit dem Updaten nicht mehr nach. Rahmenbedingungen: Wir erledigen das Senden der Daten vie TCPClient und dann werten wir den Bitstream aus. dieser liegt in JSON Format vor, wird dann Decodiert und die neuen Positionsdaten werden übertragen. Kann mir jemand sagen wie man sowas normalerweise löst, inklusive Beispiel oder seite Danke schonmal + Multi-Zitat Zitieren
#2 19. September 2013 AW: Telnet Server with JSON Schonmal im gamedev forum geschaut? Multiplayer and Network Programming - GameDev.net Dort findest du bestimmt einiges an Beispielen und Techniken + Multi-Zitat Zitieren
#3 20. September 2013 AW: Telnet Server with JSON Hier mal ein paar mehr Infos Gut das mit dem Übertragen jeden Frames, habe ich mir schon gedacht, deshalb habe ich mal versucht nur jede Sekunde oder alle 2 Sekunden zu übertragen. aber selbst das ist schon zu viel. Bei dem Server handelt es sich um einen normalen Server mit dem connection type Telnet statt SSH oder so. Hier mal die Methode für das Connecten zum Server Code: void ConnectToServer(TcpClient client, IPEndPoint serverEndPoint) { client.Connect(serverEndPoint); clientStream = client.GetStream(); encoder = new ASCIIEncoding(); buffer = encoder.GetBytes("Hello Server!"); clientStream.Write(buffer, 0 , buffer.Length); clientStream.Flush(); } und hier für das Senden und Empfangen der Position: Code: public void SchickePositionsdaten(float x, float y) { //{"from":1000,"to":[123,234,345],"message":{"cmd":"posupdate","x":1,"y":2}} string jsonString = ""; if(username == "usera") jsonString = "{\"to\":2,\"msg\":{\"x\":" + x + "}}"; if(client != null && client.Connected) { //clientStream = client.GetStream(); //encoder = new ASCIIEncoding(); buffer = encoder.GetBytes(jsonString); clientStream.Write(buffer, 0 , buffer.Length); clientStream.Flush(); } } beim Empfangen wird testhalber erstmal nur der x Wert behandelt Code: public float EmpfangePositionsdaten(string jsonBefehl) { var N = JSON.Parse(jsonBefehl); //string fromVal = N["from"].ToString(); string toVal = N["to"].ToString(); string x = N["msg"]["x"]; string y = N["msg"]["y"]; float r = 0; float.TryParse(x, out r); return r; } hoffe damit kann jemand was mehr anfangen und mir evtl. weiterhelfen + Multi-Zitat Zitieren
#4 20. September 2013 AW: Telnet Server with JSON 1. Was vetsteht du unter "Telnet" Server? Ein normaler TCP-Socket sollte doch reichen. 2. Warum JSON? Nich falsch verstehen, JSON ist klasse, aber bei Zeitkritischen Dingen wäre ein Binäres Protokoll von Vorteil. 3. Deine ConnectToServer Funktion sieht so aus als ob du jedes mal eine neue Verbindung aufbaust um deinen `buffer` zu übertragen?! + Multi-Zitat Zitieren
#5 20. September 2013 AW: Telnet Server with JSON Zum Server an sich kann ich nicht viel sagen, den hat nen Kumpel von mir aufgesetzt. Die Connectmethode wird einmalig beim Start des Spiels aufgerufen. danach nicht mehr. Bei Unity3d gibt es eine Methode void Start(). die wird zum Programmstart aufgerufen und darin wird auch das ConnectToServer aufgerufen. Wie würde so ein Binäres Protokoll aussehen. hättest du da nen Link für mich? Der Server ist glaub ich ein normaler TCP server, der als connectiontype Telnet verwendet, aber wie gesagt, da habe ich nicht so die ahnung von. + Multi-Zitat Zitieren
#6 20. September 2013 Zuletzt bearbeitet: 20. September 2013 AW: Telnet Server with JSON Ein binäres Protokoll in der Art: int = 4 bytes signed integer Code: int ::= frame (in diesem fall 6 * 4 bytes) int ::= player-id (from) int ::= player-id (to) int ::= pos-x int ::= pox-y int ::= pox-z Code: int frame = input.readInteger(); YXZ buffer = input.readBytes(frame); int from = buffer.readInteger(); int to = buffer.readInteger(); int posX = buffer.readInteger(); int posY = buffer.readInteger(); int posZ = buffer.readInteger(); process(from, to, posX, posY, posZ); 1 Person gefällt das. + Multi-Zitat Zitieren