Java >> Java tutorial >  >> Tag >> HTTP

Implementering af lokal HTTP-server

Den følgende vejledning viser, hvordan man udfører kommunikation mellem nanohttpd, en http-server til Java og Mathematica . Resultatet er en server, der, hvis du går til dens adresse i en webbrowser, viser resultatet af SessionTime[] , dvs. tiden siden Mathematica kerne, der er knyttet til serveren, er startet.

Jeg vil skrive, som om læseren brugte OS X med Maven installeret, fordi det er det operativsystem, jeg bruger, men denne løsning virker på alle operativsystemer med de korrekte, åbenlyse modifikationer. Mapper og så videre. På OS X kan Maven installeres med Brew vha.

brew -install maven

Kom godt i gang med nanohttpd:

  1. Download den seneste version af nanohttpd fra Github.

  2. Følg trinene angivet under "hurtigstart" på nanohttpd.org

Tilføj dette til toppen af ​​eksempelappen blandt de andre importer:

import com.wolfram.jlink.*;

Find JLink.jar på din harddisk. På OS X er den placeret på

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

Naviger til appens bibliotek og kør følgende kommando for at inkludere JLink.jar i Maven-projektet (med de relevante ændringer):

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

Og modificer appens pom.xml ved at tilføje filen som en afhængighed:

  <dependency>
      <groupId>com.wolfram.jlink</groupId>
      <artifactId>JLink</artifactId>
      <version>1.0</version>
  </dependency>

Tjek, at du stadig kan kompilere applikationen, og at den stadig virker. Hvis det nu er sandt, skal du erstatte koden i App.java med denne (se eksempelprogrammet her):

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 = "<html><body><p>";

        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 + "</p></body></html>";

        return newFixedLengthResponse(msg);
    }
} 

Slå linjen op med String jLinkDir = og bekræft, at mappen er rigtig. Hvis du bruger et andet operativsystem end OS X, skal du også konfigurere linjen med MathLinkFactory i det. Information om det er tilgængelig her.

Kompiler koden og kør den ved (som du gjorde før for at køre eksempel-appen), naviger til projektets bibliotek og udfør følgende kommandoer:

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

hvor du har redigeret mainClass korrekt. Du har nu en HTTP-server på adressen http://localhost:8888/, der kalder på en Mathematica kernel og bruger sit svar til at besvare anmodninger.


Det følgende er et eksempel på implementering af en simpel HTTP-server i kun Wolfram Language-kode:

https://github.com/arnoudbuzing/wolfram-server

Du sender den en POST-anmodning, hvor kropsdataene for HTTP-anmodningen indeholder den Wolfram-sprogkode, du ønsker at evaluere.

Det (kørende) wolframserver.wls script behandler anmodningen ved at evaluere kodestrengen og returnere resultatet som ExpressionJSON, som burde være generisk nok til at parse og behandle i de fleste programmeringssprog (inklusive javascript til webbrowsere).

Det er et nyt og udviklende projekt for mig, så giv det gerne en stjerne, hvis dette er nyttigt for dig, fordi det vil fortælle mig, hvor stor interesse der er for dette (og hvor meget tid jeg skal bruge på det til at lave forbedringer).


Fra Mathematica 12 er der en indbygget funktion SocketListen der kan starte en webserver og svare på HTTP-anmodninger.

SocketListen er også tilgængelig i Mathematica 11.2, men kun på forsøgsbasis.

Yderligere læsning:Network Programming Guide.


Java tag