IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

WebSocket SSL sur Delphi XE5 (Firemonkey)


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut WebSocket SSL sur Delphi XE5 (Firemonkey)
    Bonjour,

    Je cherche à faire fonctionner la websocket basée sur les composants Indy partagée ici : https://gitlab.com/staspiter/websock...o/tree/master/
    Je suis sous Delphi XE5 dans un projet Firemonkey et j'ai des erreurs que je n'arrive pas à corriger concernant la manipulation d'un tableau de Byte.

    Voici la fonction concernée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TWebSocketIOHandlerHelper.WriteBytes(RawData: TArray<byte>);
    var
      Msg: TArray<byte>;
    begin
      // https://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side
     
      Msg := [$81];
     
      if Length(RawData) <= 125 then
        Msg := Msg + [Length(RawData)]
      else if (Length(RawData) >= 126) and (Length(RawData) <= 65535) then
        Msg := Msg + [126, (Length(RawData) shr 8) and 255, Length(RawData) and 255]
      else
        Msg := Msg + [127, (int64(Length(RawData)) shr 56) and 255, (int64(Length(RawData)) shr 48) and 255,
          (int64(Length(RawData)) shr 40) and 255, (int64(Length(RawData)) shr 32) and 255,
          (Length(RawData) shr 24) and 255, (Length(RawData) shr 16) and 255, (Length(RawData) shr 8) and 255, Length(RawData) and 255];
     
      Msg := Msg + RawData;
     
      try
        Write(TIdBytes(Msg), Length(Msg));
      except
      end;
    end;
    J'ai les erreurs suivantes à la compilation
    [dcc32 Erreur] WebSocketServer.pas(216): E2010 Types incompatibles : 'System.TArray<System.Byte>' et 'Set'
    [dcc32 Erreur] WebSocketServer.pas(223): E2010 Types incompatibles : 'Integer' et 'Int64'
    Dans ma version de Delphi je ne peux pas manipuler un tableau de la sorte : Msg := [$81];, ou encore : Msg := Msg + [Length(RawData)]
    Mais je galère en utilisant SetLength et en écrivant les données Byte par Byte.

    Pouvez-vous m'aider à traduire cette fonction ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ce n'est pas bien compliqué pourtant

    mais c'était plus simple sous Delphi < 2009 ou on pouvait mettre ce qu'on voulait dans un String 8 bits...reste le RawByteString mais ce n'est pas recommandé.

    sinon j'ai un composant WebSocket qui devrait passer sous XE5
    https://github.com/tothpaul/Delphi/b...r/idWebSocket/

    avec une approche plus classique des TBytes et en fait plus optimisée puisque je calcule la taille des données une fois pour toute, alors que l'écriture avec [...] + [...] var provoquer des réallocations dans tous les sens
    https://github.com/tothpaul/Delphi/b...Socket.pas#L66
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourquoi avoir écrit le code ainsi, ton lien montre que des manipulations [1] .. [9]

    Citation Envoyé par Tillt Voir le message
    Dans ma version de Delphi je ne peux pas manipuler un tableau de la sorte : Msg := [$81];, ou encore : Msg := Msg + [Length(RawData)]
    Mais je galère en utilisant SetLength et en écrivant les données Byte par Byte.
    C'est nouveau ?
    On peut manipuler des tableaux ainsi dans un Delphi très récent ?
    Simple concaténation de tableau ?

    Super ... les langages évoluent tellement, dans dix ans, savoir anticiper la taille de buffer devra une science de haut niveau !
    J'espère que les écoles apprennent le C d'un côté pour que les bases de la programmation par ce que bientôt, tout sera développé par des enfants sur SCRATCH 3 .



    Repart si un code plus simple tel qu'il sont dans Stack Overflow

    Tu triches, un tableau fixe de 10 éléments systématiquement et juste changer le Len passet en paramètre au Write

    Vite fait à l'arrache cela ressemble à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    procedure TWebSocketIOHandlerHelper.WriteBytes(RawData: TArray<byte>);
    var
      Msg: TArray<byte>;
      HeaderSize: Integer;
    begin
      // https://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side
     
      SetLength(Msg, 10 + Length(RawData));
      Msg[0] := $81;
     
      if Length(RawData) <= 125 then
      begin
        Msg[1] := Length(RawData)
        HeaderSize:= 2;
      end
      else if (Length(RawData) >= 126) and (Length(RawData) <= 65535) then
      begin
        Msg[1] := 126;
        Msg[2] := (Length(RawData) shr 8) and 255
        Msg[3] := Length(RawData) and 255]
        HeaderSize:= 4;
      end
      else
      begin
        Msg[1] := 127;
       // Si dcc32  SetLength est limité à Integer et Length aussi, TBytesStream par mieux toujours 2Go on dirait
       // Si dcc64, PByte oui 8Go ça passe, j'ai par contre jamais essayé un TBytes à 8Go, un test à faire !
        Msg[2]:= 0; // (int64(Length(RawData)) shr 56) and 255;
        Msg[3] :=0; // (int64(Length(RawData)) shr 48) and 255;
        Msg[4] := 0; //     (int64(Length(RawData)) shr 40) and 255;
        Msg[5] :=0; // (int64(Length(RawData)) shr 32) and 255;
        Msg[6] := (Length(RawData) shr 24) and 255;
        Msg[7] := (Length(RawData) shr 16) and 255;
        Msg[8] := (Length(RawData) shr 8) and 255;
        Msg[9] := Length(RawData) and 255];
     
         HeaderSize:= 10;
      end;
     
      Move(RawData[0], Msg[HeaderSize], Length(RawData));
     
      try
        Write(TIdBytes(Msg), HeaderSize + Length(RawData));
      except
      end;
    end;

    EDIT : DCC64, c'est bon pour le NativeInt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      Msg: TArray<byte>;
      Len: NativeInt;
    begin
      Len := NativeInt(MaxInt) * 4;
      SetLength(Msg, Len);
      OutputDebugString(PChar(IntToStr(Length(Msg))));
    end ;
    Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Len := Length(RawData);
        Msg[2] :={$IFDEF CPUX64} (Len shr 56) and 255 {$ELSE} 0 {$ENDIF};
        Msg[3] :={$IFDEF CPUX64} (Len shr 48) and 255 {$ELSE} 0 {$ENDIF};
        Msg[4] :={$IFDEF CPUX64} (Len shr 40) and 255 {$ELSE} 0 {$ENDIF};
        Msg[5] :={$IFDEF CPUX64} (Len shr 32) and 255 {$ELSE} 0 {$ENDIF};
        Msg[6] := (Len shr 24) and 255;
        Msg[7] := (Len shr 16) and 255;
        Msg[8] := (Len shr 8) and 255;
        Msg[9] := Len and 255;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ah oui tient, dans mon code j'utilise des Integer...mais bon balancer 8Go sur un WebSocket, faut le vouloir
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. DELPHI XE5 sur mac ?
    Par AlfredKr dans le forum Langage
    Réponses: 3
    Dernier message: 06/08/2018, 10h25
  2. Réponses: 5
    Dernier message: 26/05/2015, 16h37
  3. Réponses: 2
    Dernier message: 19/05/2015, 08h49
  4. Problème installation jvcl sur Delphi xe5
    Par Pierre95 dans le forum Débuter
    Réponses: 9
    Dernier message: 11/01/2014, 13h24
  5. cours directx francais sur delphi
    Par charly dans le forum DirectX
    Réponses: 2
    Dernier message: 28/05/2002, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo