Ich habe die Sockets-Beispiele gelesen, aber ich kann JMP nur dazu bringen, den Empfang einer Anfrage zu bestätigen. Ich kann weder die Nutzdaten noch die Nachricht der Anfrage erhalten.Gibt es eine bessere Möglichkeit als Sockets oder Scheduler, um eine nicht blockierende Kommunikation zu erreichen?
Alles ist auf Windows.
Skriptindex: Sockets
Detaillierte Anleitung zur Verwendung von JSL zum Abrufen von Daten von der API
Socket-Kommunikation zum Abrufen und Protokollieren von Nachrichten von JMP-, R- und Python-Skripten
Ich verstehe das auch nicht: ((blobdata == Char To Blob( "" )) & (Left(r[2], 11) == "WOULDBLOCK:" ))
Was ist r[2]? Der Wert dieser Dinge wird immer wieder auf andere Dinge indiziert? In Python würde ich erwarten, etwas zu sagen wie:
R = Anfrage
my_data_dict = r .aktualisieren({ 'last_jmp_data' :pd.DataFrame(request.json)})
Das funktioniert in Python, um meine Daten abzurufen, aber wenn ich versuche, sie an JMP zurückzugeben, werden nur die Header gedruckt. Ich kann nicht auf die von mir gesendeten JSON-Daten zugreifen. Ich gehe davon aus, dass meine Daten in einigen sind r[#] Element?
Ich versuche, etwas Nicht-Blockierendes zu schaffen, das Daten empfangen kann. Im Moment verwende ich eine hackige Lösung mit dem Scheduler, um den Workflow zu erstellen, und es funktioniert zwar, ist aber umständlich.
Ich verwende den Scheduler, um diese Funktion geplant zu halten. Dies trifft auf meinen Flask-Server, empfängt Daten als JSON zurück und aktualisiert meine Haupttabelle. Durch das Update löscht JMP alle Filter, sodass wir das in einer Zeichenfolge protokollieren und es dann erneut auf den Benutzer anwenden verliert nicht, was sie getan haben.
Ich möchte in der Lage sein, eine Anfrage über Javascript zu SENDEN und sie mit JMP abzurufen:
Das ist meine JavaScript-Funktion, ich brauche keine Antwort, ich möchte nur, dass sie zu JMP geht. Zuvor habe ich eine andere JavaScript-Problemumgehung verwendet, um eine JSON-Datei in meine Downloads zu schreiben, und meine Scheduler-Schleife verwendet, um den Download-Ordner des Benutzers auf eine bestimmte JSON-Datei zu überwachen, mit der die Tabelle aktualisiert werden soll.
Bei dieser Anwendung handelt es sich um eine Einzelbenutzer-App, die lokal auf dem PC des Benutzers ausgeführt wird und nicht mit externen Ressourcen kommuniziert. Ich musste lediglich meine GUI/bestimmte Dateninteraktionen in einem Browser durchführen, möchte diese Daten aber trotzdem wieder in JMP abrufen meine chimäre JMP/HTML/JS/CS S-Anwendung.
Javascript-Code, den ich verwende, um Daten vom Browser an meinen Python-Server zu senden
var xhr = new XMLHttpRequest();
xhr.open("POST", 'http://localhost:8088/passdata', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send([my_json_data]);
Jmp-Schedulerschleife
//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
);JMP-Aufruf an den Python-Server, JSON-Daten empfangen und bei Bedarf aktualisieren.
//****************************************************************
//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>
Socket-Skripte verstehe ich nicht
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();