PureBasic

Forums PureBasic
Nous sommes le Mar 17/Sep/2019 18:12

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 
Auteur Message
 Sujet du message: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Sam 05/Mai/2018 18:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
hi les pures :D , j'espère que vous allez bien.

le code permet de crée un connexion TCP entre le navigateur et purebasic en utilisant javascript, pour envoyer et recevoir des données instantanée depuis et pour contrôler les pages web 8) !!!!...

j'ai utiliser l'objet "WebSocket" pour communiquer entre vous trouver tous les détails sur la méthode employé ici :

https://developer.mozilla.org/fr/docs/WebSockets/Writing_WebSocket_servers

le code pb

Code:
EnableExplicit

;by celtic88 2018
;à propos de WebSockets
;https://developer.mozilla.org/fr/docs/WebSockets/Writing_WebSocket_servers

UseSHA1Fingerprint()

Structure Byte_Array
  Byte.A[0]
EndStructure

Procedure.s WebSocket_DecryptKey(ClientKey.s)
  ;décrypter le "WebSocket-Key"
  Protected Sf.s = StringFingerprint(ClientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", #PB_Cipher_SHA1)
  Protected *Buffer = AllocateMemory(1024)       
  Protected j = 0, i
  For i=1 To Len(Sf) Step 2
    PokeA(*Buffer+j, Val("$" + Mid(Sf, i ,2)))
    j + 1
  Next
  Protected b64.s = Space(1024)
  Base64Encoder(*Buffer,j,@b64, 1024)
  ProcedureReturn PeekS(@b64,-1,#PB_Ascii)
EndProcedure

Procedure.s WebSocket_JsonCreateCommand(type.s,content.s)
  ;utiliser JSON pour communiquer avec le client
  Protected jid = CreateJSON(#PB_Any)
  Protected Person = SetJSONObject(JSONValue(jid))
  SetJSONString(AddJSONMember(Person, "type"), type)
  SetJSONString(AddJSONMember(Person, "content"), content)
  Protected rjsn.s = ComposeJSON(jid)
  FreeJSON(jid)
  ProcedureReturn rjsn
EndProcedure

Procedure.s WebSocket_JsonGetCommand(jSs.s,type.s)
  ;obtenire la command envoiye par le client
  Protected jid = ParseJSON(#PB_Any,jSs)
  If jid
    Protected rjsn.s = GetJSONString(GetJSONMember(JSONValue(jid), type))
    FreeJSON(jid)
    ProcedureReturn rjsn
  EndIf
EndProcedure

Procedure Helper_SwapData(*pData.Byte_Array, Size) ; convert big endian to little endian and v..
  Protected *tmem.Byte_Array = AllocateMemory(Size)
  Protected i
  For i = 0 To Size -1
    *tmem\Byte[i] = *pData\Byte[Size - i - 1]
  Next
  CopyMemory(*tmem, *pData, Size)
  FreeMemory(*tmem)
EndProcedure

Procedure.s WebSocket_GetMessage(ClientID,*Buffer.Byte_Array,Len)
  ;Déchiffrer le message envoyé par le client
 
  Protected opcode.b = *Buffer\Byte[0] & $f
  Protected fin.b    = *Buffer\Byte[0] >> 4 & $f
  ;   Debug RSet(Bin(PeekA(*Buffer),#PB_Byte), 8, "0")
  ;   Debug opcode
  ;   Debug fin
 
  Protected frameCount = 2
  Protected length.q = *Buffer\Byte[1] & 127
  If length = 126
    length = PeekU(@*Buffer\Byte[2])
    Helper_SwapData(@length, 2)
    frameCount + 2
  ElseIf  length = 127
    length = PeekQ(@*Buffer\Byte[2])
    Helper_SwapData(@length, 8)
    frameCount + 8
  EndIf
 
  Protected Key = PeekL(@*Buffer\Byte[frameCount])
  frameCount + 4
 
  Protected *palldata = AllocateMemory(frameCount+(length*2)+20)
  CopyMemory(*Buffer, *palldata, Len)
  If length > Len-frameCount
    Repeat
      Protected rvc = ReceiveNetworkData(ClientID, *palldata + Len, length)
      If rvc = -1:Goto __SKIIP:EndIf
      Len + rvc
    Until length = Len-frameCount
  EndIf
 
  Protected *DBuffer = *palldata + length + frameCount
 
  Protected j = 0, i
  For i = frameCount To length + frameCount -1
    PokeA(*DBuffer + j, PeekA(*palldata + i) ! PeekA(@Key + (j%4)))
    j + 1
  Next
 
  ;ShowMemoryViewer(*DBuffer, j)
  Protected pstring.s = PeekS(*DBuffer, j ,#PB_Ascii)
 
  __SKIIP:
  FreeMemory(*palldata)
 
  ProcedureReturn pstring
EndProcedure

Procedure WebSocket_SendMessage(ClientID, Message.s)
  ;envoyer message à client
  Protected send.q  = 129
  SendNetworkData(ClientID, @send, 1)
  Protected StringLen.q  = StringByteLength(Message, #PB_Ascii)
  send  = StringLen
  Protected datasieze
  If send > 65535
    send = 127
    datasieze = 8
  ElseIf send > 125
    send = 126
    datasieze = 2
  EndIf
  SendNetworkData(ClientID, @send, 1)
  If datasieze
    Helper_SwapData(@StringLen, datasieze)
    SendNetworkData(ClientID, @StringLen, datasieze)
  EndIf
  SendNetworkString(ClientID, Message, #PB_Ascii)
EndProcedure

Procedure.s HttpRequest_QueryHeaders(Request.s, FileID.s)
  FileID = StringField(Request, 2, FileID)
  FileID = StringField(FileID, 1, #CRLF$)
  ProcedureReturn FileID
EndProcedure

DisableExplicit

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 8100
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)
 
  Repeat
   
    SEvent = NetworkServerEvent()
   
    If SEvent
     
      ClientID = EventClient()
     
      Select SEvent
         
        Case #PB_NetworkEvent_Connect
          Debug  "A new client has connected !"
         
        Case #PB_NetworkEvent_Data
          FillMemory(*Buffer, 1000)
          Len = ReceiveNetworkData(ClientID, *Buffer, 1000)
          reQ.s = PeekS(*Buffer, -1, #PB_UTF8)
         
          If HttpRequest_QueryHeaders(reQ, "GET") ; vérifier si la demande est pour la connexion...
                                                  ; envoyer la demande acceptée...
            SreQ.s = "HTTP/1.1 101 Switching Protocols"  + #CRLF$ +
                     "Upgrade: websocket"                + #CRLF$ +
                     "Connection: Upgrade"               + #CRLF$ +
                     "Sec-WebSocket-Accept: "            +
                     WebSocket_DecryptKey(HttpRequest_QueryHeaders(reQ, "Sec-WebSocket-Key: ")) +
                     #CRLF$ + #CRLF$
           
            SendNetworkString(ClientID, SreQ, #PB_Ascii)
          Else
            ;message a été envoyé par le client
            msg.s = WebSocket_GetMessage(ClientID,*Buffer,Len)
            ;obtenir les informations de la commande
            Debug "command Type : " + WebSocket_JsonGetCommand(msg,"type")
            Debug "command content : " + WebSocket_JsonGetCommand(msg,"content")
            ;envoyer "Slt Les pures" :commande type texte
            WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("text","Slt les Pures"))
           
          EndIf
        Case #PB_NetworkEvent_Disconnect
          Debug "Client "+Str(ClientID)+" has closed the connection..."
         
      EndSelect
    Else
      Delay(10)
    EndIf
   
  Until Quit = 1
 
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
 
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf


End   




code html

Code:
<!DOCTYPE html>
<html>

<head>
<meta charset=utf-8>
<title>Purebasic WebSocket</title>
<script>
var exampleSocket;
 
function connect(){
    // créer l'objet WebSocket et connecter à "localhost = 127.0.0.1" sur le port 8100
    exampleSocket = new WebSocket("ws://localhost:8100");
   
    exampleSocket.onopen = function (event) {
   // la connexion est établie avec le serveur
   console.log("/!\\ Connexion serveur");
   // envoyer un message
    exampleSocket.send('{ "type": "start", "content":"By celtic88"}');
   }
 
    exampleSocket.onerror = function (event) { console.log(event); }
   
    exampleSocket.onmessage = function (event) {
   // Des données ont été reçues !
   // extraire la commande envoyée par le serveur
     var message = JSON.parse(event.data);
         switch(message.type) {
         case "text":
            console.log(message.content);
            document.getElementById("message").innerHTML = message.content;
            break;
         case "close":
             // fermer la fenêtre
            console.log(message.content);
                window.open('', '_self', '');
                window.close();
            break;         
          case "click":
             // Cliquez sur un élément
            console.log(message.content);
            document.getElementById(message.content).click
            break;         
          case "open_url":
                //
            break;
       }
   }
   
    exampleSocket.onclose = function (event) {
   // déconnection ! reconnecter aux serveur ?
    connect() ;
   document.getElementById("message").innerHTML = "en attente de la connexion...";
    console.log("/!\\ Déconnexion serveur");
   }
   
}
  function helloServer()
  {
    // envoyer le message écrit dans txtgadget "myText"
     exampleSocket.send('{ "type": "tchat", "content":"'+document.getElementById("myText").value+'"}');
  }
 
connect();
</script>
</head>

<body>

<h1>WebSocket Exemple</h1>

<p>sélectionner "Console" dans le debugger menu. </p>

<input type="text" id="myText" value="message...">

<input type="button" onclick="helloServer()" value="envoyer le message au serveur">

<fieldset><legend>Message serveur</legend>
  <div id="message" ></div>
</fieldset>

</body>
</html>



amusez vous bien :) , a +

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Sam 05/Mai/2018 20:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
Le code ne compile pas, quelle version de Purebasic faut t'il utiliser ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Sam 05/Mai/2018 22:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
nico a écrit:
Le code ne compile pas, quelle version de Purebasic faut t'il utiliser ?
5.46 LTS

Le nombre de paramètres de la fonction Base64Encoder() n'est pas le même avec la version 5.60 et supérieure.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Sam 05/Mai/2018 22:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
J'ai testé tout ça sur mon serveur local. Joli travail Celtic. Merci pour ce partage. :wink:

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Dim 06/Mai/2018 8:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
falsam a écrit:
J'ai....


merci @FALSAM,

_________________
.....i Love Pb :)


Dernière édition par celtic88 le Dim 06/Mai/2018 19:25, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Dim 06/Mai/2018 15:15 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
Waooouuuh !!! ça marche niquel !!! :D
C'est de la balle ton truc, tu veux dire que tu pourrais injecter du JS à la mode MozRepl ? 8O
https://addons.mozilla.org/en-US/firefox/addon/mozrepl/
Trop top, j'utilise cette extension depuis pas mal de temps pour piloter FF, Merci Celtic 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Dim 06/Mai/2018 19:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
slt @Kwai chang caine

Citation:
tu veux dire que tu pourrais injecter du JS


ops Je n'ai rien dit.. :D 8)

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Lun 07/Mai/2018 18:59 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
Coooolllll !!! :D 8)

Mais comme dab "J'ai pas arrivé" :mrgreen:
Si je veux injecter un changement de page à FF
J'ai éssayé :
Code:
WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("window","location.href = 'http://www.google.com'"))
ou
Code:
WebSocket_SendMessage(ClientID, "window.location.href = 'http://www.google.com'"))
sans succès :oops:

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Lun 07/Mai/2018 21:56 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
:D
ajouter ces lignes dans HTML

Code:
          case "KCC_RUNJS":
                //Execute Javascript
            eval(message.content);
         
            break;


et bimm
Code:
WebSocket_SendMessage(ClientID, WebSocket_JsonCreateCommand("KCC_RUNJS","alert('hello KCC')"))

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Lun 07/Mai/2018 22:28 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
le problème c'est que dans certains sites en n peut pas accéder a ces éléments pour les manipuler "bloquer par la protection" en peut le bypasser mais c'est très lourd et puis il y a des programmes qui font ça ...

TROP FACILE POUR ÊTRE VRAI, j abandonne le projet. :cry:

:D

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Mar 08/Mai/2018 9:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
Merci beaucoup CELTIC 8)
Ca marche top !!!! :D

Citation:
TROP FACILE POUR ÊTRE VRAI, j abandonne le projet.
Dommage pour le travail que tu as déjà fait :|
En tout cas grâce à toi c'est un super début 8)

C'est un sujet passionnant, comme je te l'ai dit il y a pas mal de REPL qui existent, j'utilise MOZREPL perso pour piloter FF.
Mais avoir un code qui fonctionne avec notre PB d'amour, alors là c'est un super cadeau, encore merci :wink:
Décidément tu fais toujours des codes hyper intéressants en plus d'être du très haut de gamme 8)
Tu es à mes yeux d'une grande valeur pour ce forum ..

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Mar 08/Mai/2018 17:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 310
Localisation: Alger
merci kcc
j'essaie d'être utile :)

et un conseil:
apprend toi le java (scrip) parce que c le langage informatique le plus demandé dans le monde et le mieux payé.

prend soin de toi 8) +

_________________
.....i Love Pb :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: "WebSocket" connecter au navigateur [Jscript]
MessagePosté: Jeu 10/Mai/2018 8:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
Merci à toi 8)

Celtic a écrit:
j'essaie d'être utile
Et bien pour moi tu l'es beaucoup. 8)
Tu me fait rêver et à cette époque c'est pas facile :

- Voir ces codes d'une complexité digne des grands maitres de la programmation, alors que tu apprends tout seul....je suis à genoux.
Comment j'aimerais avoir un morceau de ton cerveau :mrgreen:

- Puis aussi par ce comportement que tu as, comme certains des membres de ces forums de fouiller partout, tripoter à tout, faire des essais dans ton laboratoire, tel un savant fou :lol:

Image

Puis venir nous donner sans rien en échange le résultat de tes recherches 8)

Bon c'est sûr que tes codes volent tellement haut, que lorsque tu arrêtes (ce qui est souvent je dois le reconnaitre :wink: ), je n'ai pas les moyens intellectuels de les modifier, les utiliser, et encore moins les améliorer ou faire évoluer :| mais ils ont le mérite d’exister et nous démontrer une fois de plus, comme si il en était besoin la puissance de PB 8O 8)

A bientôt pour ta prochaine idée de "fou" MASTER 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye