AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi 7,indy ,Game Maker Studio Server
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 7,indy ,Game Maker Studio Server

Ein Thema von Master_Jochen · begonnen am 5. Jul 2015
Antwort Antwort
Master_Jochen

Registriert seit: 22. Aug 2008
12 Beiträge
 
#1

Delphi 7,indy ,Game Maker Studio Server

  Alt 5. Jul 2015, 15:05
Hallo leute da ich hier immer was nützliches finde hoffe ich auf eure hilfe.

Ich möchte mit Delphi einen Server für ein MMO erstellen das ich in Game Maker Studio code.
In game maker schicke ich die daten mit diesem code ab der server soll dann Byte mit inhalt 5 lesen und wissen das als nächstes ein string folgt.

Code:
    client = network_create_socket( network_socket_tcp );
    network_connect_raw( client, "127.0.0.1", 8090 );
    buff = buffer_create( 256, buffer_grow, 1)
    buffer_seek(buff, buffer_seek_start, 0);
    buffer_write(buff, buffer_u8, 5 );
    buffer_write(buff, buffer_string, "hallo" );
    network_send_raw( client, buff, buffer_tell(buff) );
Also was soll der server können...

1 mehrere clients gleichzeitig bedienen.
2 unabhängig von clients anfragen daten an clients senden (globaler event)
3 strings,double,integer lesen und senden können



nun zu meinen Fragen

1.wie gehe ich am besten an die sache ran? ich habe mich bereits für delphi entsvhieden da ich hier die meiste erfahrung habe c++ ,c sharp,java,node.js scheiden für mich aus.natürlich habe ich auch hhier im forum schon einige beispiele ausprobiert editiert und versucht auf mein project anzuwenden leider vergebends. Mein letzter versuch schaffte es zumindest das cmd byte mit wert 5 zu lesen aber liest dann den folgen den string nicht mehr.
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdTCPServer, IdGlobal;

type
  TForm1 = class(TForm)
    Button1: TButton;
    log: TMemo;
    IdTCPServer1: TIdTCPServer;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



var
  LastSessionID: Integer = 1;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  SessionID: Integer;

  procedure DoLog(const Msg: String);
  var
    S: String;
    I: Integer;
  begin
    S := Format('%s-%0.6d: %s', [FormatDateTime('YYMMDD HHNNSS ZZZ', Now), SessionID, Msg]);
    for I := 1 to Length(S) do
      if S[I] in [#10,#13] then S[I] := ' ';
  // da Memo1.Lines.Add() intern über SendMessage() arbeitet sollte dies Threadsafe sein.
    log.Lines.Add(S);
  end;

  function ReadByte: Byte;
  begin
    AThread.Connection.ReadBuffer(Result, SizeOf(Result));
    //DoLog(inttostr(Result));
  end;

  function ReadLong: Cardinal;

    function SwapLong(Value: Cardinal): Cardinal;
    // konvertiert Big Endian zu Little Endian
    // im INet ist es üblich ALLE Daten in Big Endian zu übertragen
    asm
      BSWAP EAX
    end;

  begin
    AThread.Connection.ReadBuffer(Result, SizeOf(Result));
    Result := SwapLong(Result);
  end;

  function ReadString: String;
  begin
    SetLength(Result, ReadByte);
    AThread.Connection.ReadBuffer(Result[1], Length(Result));
  end;

  procedure WriteByte(Value: Byte);
  begin
    AThread.Connection.WriteBuffer(Value, SizeOf(Value));
  end;

  procedure WriteString(const Value: ShortString);
  begin
    WriteByte(Length(Value));
    AThread.Connection.WriteBuffer(Value[1], Length(Value));
  end;

var
  FileName: String;
  FileSize: Cardinal;
  FileStream: TStream;
  cmd:integer;
begin
  SessionID := LastSessionID;
  Inc(LastSessionID);



      cmd:=ReadByte;
      DoLog(inttostr(cmd));
      while True do
        case cmd of
          5: begin // LOGOUT
               DoLog('try to read string');
               DoLog(ReadString);
               Break;
             end;


         end;
         sleep(1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
IdTCPServer1.Active:=false;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
   log.Lines.Add('Client disconnected');
end;


end.
wenn mir jemand wenigstens mit einem kleinen code schnipsel start hilfe geben könnte wäre ich sehr dankbar. Leider kenne ich auch nicht die genauen abläufe mit buffern nicht. Weder von game maker noch von delphi Game maker intern funktioniert das ganze recht simpel man schickt den cmd vorran und dann weiß der server was das daten paket enthält also zb.

wenn ich byte 10 schicke kommt darauf folgend

integer
integer
string

an.

Ich freue mich auf eure posts bitte geht nicht zu hart mit mir ins Gericht ich bin noch anfänger aber möchte dieses project wirklich gerne verwirklichen.
Ich bin ein noob sorry.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz