J'ai lu les exemples de sockets, mais tout ce que je peux faire pour que JMP accuse réception d'une demande, je ne peux pas obtenir la charge utile ou le message de la demande.Existe-t-il un meilleur moyen que les sockets ou le planificateur pour obtenir une communication non bloquante ?
Tout est sur les fenêtres.
Index des scripts : sockets
Conseils détaillés sur l'utilisation de JSL pour obtenir des données à partir de l'API
Communication par socket pour obtenir et consigner les messages des scripts JMP, R et Python
Je ne comprends pas non plus ceci : ((blobdata == Char To Blob( "" )) & (Left(r[2], 11) == "WOULDBLOCK:" ))
qu'est-ce que r[2] ? La valeur de ces choses continue d'indexer sur différentes choses ? En python, je m'attendrais à dire quelque chose comme:
r = demande
my_data_dict = r .mise à jour({ 'dernière_jmp_données' :pd.DataFrame(request.json)})
Cela fonctionne en python pour récupérer mes données, mais lorsque j'essaie de revenir à JMP, la seule chose qui imprime sont les en-têtes, je ne peux pas accéder aux données JSON que j'ai envoyées. Je suppose que mes données sont dans certains r[#] élément ?
J'essaie de faire quelque chose de non bloquant qui peut recevoir des données, en ce moment j'utilise une solution hacky avec le planificateur pour créer le flux de travail et ça marche, mais c'est maladroit.
J'utilise le planificateur pour garder cette fonction planifiée, cela frappe mon serveur de flacon, reçoit les données en retour sous forme de JSON et met à jour ma table principale la mise à jour oblige JMP à supprimer tous les filtres afin que nous enregistrions cela dans une chaîne, puis réappliquons-le pour que l'utilisateur ne perd pas ce qu'ils faisaient.
Ce que j'aimerais, c'est pouvoir ENVOYER une requête à partir de javascript et la récupérer avec JMP :
Ceci est ma fonction JavaScript, je n'ai pas besoin de réponse, je veux juste qu'elle aille dans JMP. Auparavant, j'utilisais une solution de contournement JavaScript différente pour écrire un fichier JSON dans mes téléchargements et utiliser ma boucle de planificateur pour regarder le dossier de téléchargement des utilisateurs pour un fichier JSON spécifique avec lequel mettre à jour la table.
Cette application est une application mono-utilisateur qui s'exécute localement sur le PC de l'utilisateur et ne communique avec aucune ressource externe. J'avais juste besoin de créer mon interface graphique/certaines interactions de données dans un navigateur, mais je souhaite toujours récupérer ces données dans JMP pour mon application chimérique JMP/HTML/JS/CS S.
Code Javascript que j'utilise pour envoyer des données à mon serveur python à partir du navigateur
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://localhost:8088/passdata', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send([my_json_data]);
Boucle du planificateur Jmp
//scheduled loop to ping python local server and see if it's time to update:
get_remote_update = Function({},
s = Schedule(.25,
//show("remote update fn");
//check_downloads_folder(); // old routine that was watching download folder
check_downloads_over_ip();
get_remote_update(); //loops by scheduling the event again
);l'appel jmp au serveur python reçoit les données JSON et les met à jour si nécessaire.
//****************************************************************
//check_downloads_OVER_IP();
//****************************************************************
// EXPLORE THIS dt = Open( Char To Blob( request << Send() ), "JSON" );
// see if we can just get the response back into a table without creating it with the weird JMP thing
check_downloads_over_ip = Function({},
request = New HTTP Request(
URL("localhost:8088/get_update"),
Method("Post"),
Timeout( .5 ),
);
data=request << Send;
if((data != "No Update" > 0) & ( isempty(data) != 1 ),
obj = JSON:Parse( data );
dt = JSON:Make Table(obj);
dt << show window(0);
temp_dtf = CHAR(dtf <<GET script=""></GET>
Scripts de socket que je ne comprends pas
Names default to here( 1 );
//Table to hold received data
dtLog = New Table( "Log",
New Column( "Time", Numeric, "Continuous", Format( "m/d/y h:m:s", 23, 0 ),
Input Format( "m/d/y h:m:s", 0 ) ),
New Column( "Client", Character, "Nominal" ),
New Column( "Message", Character, "Nominal" )
);
//Wait for and get data from remote machine
receivedata = Function( {c, waittime = 1, waitcount = 10},
//Varaible to store data received from remote machine
blobdata = Char To Blob( "" );
//Make socket is connected
r = c << GetPeerName();
//While receiving data or waiting to receive data
i = 0;
While(
(
(r[2] == "ok") |
((blobdata == Char To Blob( "" )) & (Left(r[2], 11) == "WOULDBLOCK:" ))
) &
(i < waitcount),
i++;
//Get data
r = c << recv( 100000 );
//If no data is received yet, wait
If(Left(r[2], 11) == "WOULDBLOCK:", Wait( waittime ) );
//Write whatever is received to the log
show("writing to log now");
Write( Blob to Char( r[3] ) );
show("Done writing to log now");
//join data to whatever is already received
blobdata = blobdata || r[3];
);
return( blobdata );
);
//Get log info from remote machine, store it in a data table
processlogconnection = function( {c},
//New row in log table
dtLog << Add Rows( 1 );
rowout = N Rows( dtLog );
Column( dtLog, "Time" )[rowout] = Today();
//Get computer name of remote machine
r = c << GetPeerName();
Column( dtLog, "Client" )[rowout] = r[3];
//Get message from the remote machine
Column( dtLog, "Message" )[rowout] = Blob to Char( receivedata( c ) );
//Close the connection
c << Close;
);
//Function to accept conections from remote machine, calls another
//function to handle communication with that machine
callbackfn = function( {x},
//Call another function with the connection returned from the Accept message
If( x[2] == "ok", processlogconnection( x[4] ) );
);
//Create a socket
con = Socket();
//Use a specific port on this computer
con << Bind( "localhost", "8081" );
//Tell this socket to be ready for other sockets to connect to it
Write( "\!nlistening on ", (con << getSockName)[3]);
con << Listen();
//Verify that the connection is active
con << getsockname;
//When something connects to this socket, call a function to handle
//the connection. Accept connections for the next 5 minutes.
con << Accept(callbackfn, 30000);
//Now messages can be sent to this connection.
//When all done, close the connection
//con << close();