Einzelnen Beitrag anzeigen

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