Kleiner, aber leistungsstarker Multithread -Webserver, der vollständig in Java SE geschrieben und dann auf Android portiert wurde.
Der Server implementiert den größten Teil der HTTP 1.1 -Spezifikation und bietet benutzerdefinierte Servlet -API, mit denen dynamische Seiten verarbeitet werden können. Die Servlet -API ist nach der offiziellen javax.servlet -API entworfen, ist jedoch nicht kompatibel. Dynamische Seiten unterstützen Cookies, Sitzungen, Dateien -Uploads und alles andere, um eine gemeinsame Webanwendung zu erstellen.
Der bereitgestellte Gradle -Wrapper sollte verwendet werden, um die Anwendung zu erstellen:
./gradlew clean build Wenn Sie zum ersten Mal den vollständigen Build ausführen, müssen Sie zuerst die Android SDK installieren. Sie können es entweder manuell installieren oder das folgende Skript verwenden, das alle erforderlichen Abhängigkeiten zu ~/android-sdk heruntergeladen und installiert.
./installsdk.sh Konfigurieren Sie die Umgebungsvariable ANDROID_HOME , damit die Dinge nach dem Anmeldung und Anmeldung zum Laufen bringen und sich wieder angemeldet haben:
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcDas HTTP -Unterprojekt ist das Herzstück der Anwendung und ist unabhängig von der Android -Plattform.
Tatsächlich war die Android -App nur ein Versuch, die experimentelle HTTP -Protokollimplementierung praktischer zu nutzen.
Eines der Entwurfsziele war es, das resultierende Artefakt kleiner und minimalistisch in Bezug auf die Abhängigkeit von anderen Bibliotheken zu halten. Es erfordert keine Komponente von Drittanbietern . Alle HTTP -Protokollimplementierung basiert auf der Parsen von Daten, die von RAW -TCP -Sockeln gelesen werden.
Sobald das RO.Polak.http -Paket ausgereift ist, wird es als unabhängiges Artefakt veröffentlicht.
Das Unterprojekt kann auf folgende Weise getestet werden:
./gradlew :http:clean :http:check -PskipAndroidBuildDer ursprüngliche Paketcode wurde neu gestaltet und mit Einheiten- und Integrationstests abgedeckt. Die Codeabdeckung sollte über 90%gehalten werden.
Der gesamte Anwendungscode richtet sich an Java 7. Er ist auch für die Android SDK -Versionen <19 zusammengestellt (versuchen finally mit Ressourcen nicht unterstützt, verwenden Sie Iutilities.
Eine weitere Kompatibilitätsbeschränkung ist, dass Random anstelle von ThreadLocalRandom zur Erzeugung von zufälligen Sequenzen in String -Utilities verwendet wird
Mutationstests können durchgeführt werden, indem der folgende Befehl ausgeführt wird:
./gradlew :http:clean :http:pitest -PskipAndroidBuild Die Ergebnisse finden Sie dann unter http/build/reports/pitest/ro.polak.http/index.html und http/build/reports/pitest/ro.polak.http/mutation.xml .
Der eigenständige Server kann verwendet werden, um das http -Unterprojekt in eine Runnable -Server -Implementierung zu bündeln. Das CLI -Unterprojekt ist auch auf der Android -Plattform unabhängig und ist nicht mit dem Haupt -APK gebündelt.
./gradlew :cli:bootRun -PskipAndroidBuildEs ist auch möglich, einen "Uber-Jar" zu erstellen und ihn als eigenständige Anwendung zu verwenden:
./gradlew :cli:fatJar -PskipAndroidBuild Das resultierende Artefakt kann dann von ./cli/build/libs/cli-all.jar gepackt werden.
Das eigenständige Serverglas kann auf jedem Computer mit dem folgenden Befehl ausgeführt werden:
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_htmlEine vollständige Liste der verfügbaren Parameter finden Sie unter httpd.properties.

Eine Demo -Anwendung wird automatisch in Heroku eingesetzt und kann erreicht werden unter:
Bitte beachten Sie, dass die bereitgestellte Anwendung die Administratoranwendung nicht enthält, da dies nur für Android verfügbar ist. Siehe Procfile für die Beschreibung der Bereitstellung.
package example ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
import ro . polak . http . servlet . HttpServlet ;
public class HelloWorld extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response ) {
response . getWriter (). print ( "Hello World!" );
}
} package example ;
import java . io . IOException ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . Filter ;
import ro . polak . http . servlet . FilterChain ;
import ro . polak . http . servlet . FilterConfig ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class RequestLoggingFilter implements Filter {
private static final Logger LOGGER = Logger . getLogger ( RequestLoggingFilter . class . getName ());
@ Override
public void init ( FilterConfig filterConfig ) throws ServletException {
// Do nothing
}
@ Override
public void doFilter ( HttpServletRequest request , HttpServletResponse response ,
FilterChain filterChain ) throws IOException , ServletException {
LOGGER . fine ( "Handling incoming request " + request . getRequestURL ());
filterChain . doFilter ( request , response );
}
}Beispielservlets finden Sie in http/src/main/java/Beispiel.
Eine praktische Verwendung von Filtern kann unter SecurityFilter.java und logoutFilter.java der Admin -Anwendung überprüft werden.
DeploymentDescriptorBuilder ist eine API -Alternative zum herkömmlichen web.xml -Ansatz, mit dem das Erstellen von Servlet -Mapping und die Filterregistrierung einfach ist. Siehe Beispielcode unten.
package example ;
import java . util . List ;
import java . util . regex . Pattern ;
import ro . polak . http . configuration . DeploymentDescriptorBuilder ;
import ro . polak . http . configuration . ServerConfig ;
import ro . polak . http . session . storage . SessionStorage ;
class DeploymentDescriptorFactory {
public List < ServletContextWrapper > buildDeploymentDescriptor ( SessionStorage sessionStorage ,
ServerConfig serverConfig ) {
return DeploymentDescriptorBuilder . create ()
. withSessionStorage ( sessionStorage )
. withServerConfig ( serverConfig )
. addServletContext ()
. withContextPath ( "/example" )
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^.*$" ))
. withUrlExcludedPattern ( Pattern . compile ( "^/(?:Login|Logout)" ))
. withFilterClass ( SecurityFilter . class )
. end ()
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^/Logout$" ))
. withFilterClass ( LogoutFilter . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/Index$" ))
. withServletClass ( Index . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/$" ))
. withServletClass ( Index . class )
. end ()
. end ()
. build ();
}
}Das Servieren statischer Ressourcen wird mithilfe von DefaultServlet implementiert
Die tatsächliche Ressourcenbelastung wird implementiert, indem ein Instanzressourcenprovider in der Serverkonfiguration registriert wird.
Derzeit werden zwei Ressourcenanbieter implementiert
package ro . polak . http . resource . provider ;
import ro . polak . http . servlet . impl . HttpServletRequestImpl ;
import ro . polak . http . servlet . impl . HttpServletResponseImpl ;
import java . io . IOException ;
public class DummyResourceProvider implements ResourceProvider {
/**
* Tells whether this resource provider can load resource for given path.
*/
@ Override
public boolean canLoad ( final String path ) {
return false ; // TODO Add some logic
}
/**
* Loads the resource for the given path by copying the stream to the response.getOutputStream().
*/
@ Override
public void load ( final String path ,
final HttpServletRequestImpl request ,
final HttpServletResponseImpl response ) throws IOException {
// TODO Load the stream to response.getOutputStream();
}
/**
* Shuts down the resource provider if necessary, usually closes all open resources.
*/
@ Override
public void shutdown () {
}
}Das folgende Beispiel zeigt, wie die JTWIG -Templating -Engine integriert wird.
Zuerst müssen Sie die Abhängigkeit von JTWIG in Ihre Gradle -Datei hinzufügen:
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...Dann funktioniert es aus der Schachtel:
package example ;
import org . jtwig . JtwigModel ;
import org . jtwig . JtwigTemplate ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . HttpServlet ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class Templating extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response )
throws ServletException {
JtwigTemplate template = JtwigTemplate . inlineTemplate ( "Hello {{ var }}" );
JtwigModel model = JtwigModel . newModel (). with ( "var" , "World" );
template . render ( model , response . getOutputStream ());
}
}






Wenn Sie eine echte SMS senden möchten, entfernen Sie bitte "& test = 1" aus den Postparamien.
SERVER_IP=192.168.1.1 ; SERVER_PORT=8080 ;
echo " Phone number: " ; read TO ; echo " Message: " ; read MESSAGE ;
wget -qO- --post-data " to= $TO &message= $MESSAGE &test=1 "
http:// $SERVER_IP : $SERVER_PORT /api/1.0/sms/sendAndroid HTTP Server verwendet Symbole aus dem wunderschön gestalteten "Farm-Fresh-Web-Symbole" von FatCow Web Hosting! Diese Symbolsätze sind unter einer Creative Commons Attribution 3.0 -Lizenz lizenziert.
Das Projekt wird bei der GNU GPLV3 -Lizenz geteilt.
Wenn piotr [at] polak [dot] ro an einer speziellen kommerziellen Lizenz interessiert sind