Skip to main content

windows - Implementing Local HTTP Server


How might I implement a local HTTP server using either Java, C#, C or purely Mathematica?


It should be able to respond with Mathematica input to GET and POST requests ideally on W7.


This is related although doesn't really work. If you would like you can read the license here



Answer



The following guide shows how to conduct communication between nanohttpd, an http server for Java, and Mathematica. The result is a server that, if you go to its address in a web browser, displays the result of SessionTime[], i.e. the time since the Mathematica kernel associated to the server started.


I'm going to write as if the reader was using OS X with Maven installed because that is the operating system I am using, but this solution works on all operating systems with the proper, obvious, modifications. Directories and so on. On OS X Maven can be installed with Brew using


brew -install maven


Getting up and running with nanohttpd:




  1. Download the latest version of nanohttpd from Github.




  2. Follow the steps listed under "quickstart" on nanohttpd.org





Add this to the top of the sample app among the other imports:


import com.wolfram.jlink.*;

Locate JLink.jar on your harddrive. On OS X it is located at


/Applications/Mathematica.app/SystemFiles/Links/JLink

Navigate to the app's directory and run the following command to include JLink.jar in the Maven project (with the appropriate modifications):


mvn install:install-file -Dfile=/Applications/Mathematica.app/Contents/SystemFiles/Links/JLink/JLink.jar -DgroupId=com.wolfram.jlink -DartifactId=JLink -Dversion=1.0 -Dpackaging=jar

And modify the app's pom.xml by adding the file as a dependency:



  
com.wolfram.jlink
JLink
1.0


Check that you can still compile the application and that it still works. Now if that's true, replace the code in App.java with this (see the sample program here):


import java.io.IOException;
import java.util.Map;
import com.wolfram.jlink.*;


import fi.iki.elonen.NanoHTTPD;

public class App extends NanoHTTPD {

KernelLink ml;

public App() throws IOException {
super(8888);
start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);


try {
String jLinkDir = "/Applications/Mathematica.app/SystemFiles/Links/JLink";
System.setProperty("com.wolfram.jlink.libdir", jLinkDir); // http://forums.wolfram.com/mathgroup/archive/2008/Aug/msg00664.html

ml = MathLinkFactory.createKernelLink("-linkmode launch -linkname '\"/Applications/Mathematica.app/Contents/MacOS/MathKernel\" -mathlink'");

// Get rid of the initial InputNamePacket the kernel will send
// when it is launched.
ml.discardAnswer();

} catch (MathLinkException e) {
throw new IOException("Fatal error opening link: " + e.getMessage());
}

System.out.println("\nRunning! Point your browers to http://localhost:8888/ \n");
}

public static void main(String[] args) {
try {
new App();

} catch (IOException ioe) {
System.err.println("Couldn't start server:\n" + ioe);
}
}

@Override
public Response serve(IHTTPSession session) {

String msg = "

";


try {
ml.evaluate("SessionTime[]");
ml.waitForAnswer();

double result = ml.getDouble();

msg = msg + Double.toString(result);
} catch (MathLinkException e) {
msg = msg + "MathLinkException occurred: " + e.getMessage();
}

msg = msg + "

";

return newFixedLengthResponse(msg);
}
}

Look up the line with String jLinkDir = and confirm that the directory is right. If you are using another operating system than OS X you also have to configure the line with MathLinkFactory in it. Information about that is available here.


Compile the code and run it by (as you did before to run the sample app), navigating to the project's directory and executing the following commands:


mvcompile
mvn exec:java -Dexec.mainClass="com.stackexchange.mathematica.App"


where you have edited mainClass appropriately. You now have an HTTP server on the address http://localhost:8888/ that calls on a Mathematica kernel and uses its response to answer requests.


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...