작지만 강력한 멀티 스레드 웹 서버는 Java SE로 완전히 작성된 다음 Android로 포팅되었습니다.
서버는 대부분의 HTTP 1.1 사양을 구현하고 동적 페이지를 처리하는 데 사용할 수있는 사용자 정의 서플렛 API를 제공합니다. Servlet API는 공식 javax.servlet API 후에 설계되었지만 호환되지 않습니다. 동적 페이지는 쿠키, 세션, 파일 업로드 및 기타 모든 것을 지원하여 공통 웹 응용 프로그램을 구축합니다.
제공된 Gradle 래퍼는 응용 프로그램을 작성하는 데 사용해야합니다.
./gradlew clean build 처음으로 전체 빌드를 실행할 때 먼저 Android SDK를 설치해야합니다. 수동으로 설치하거나 필요한 모든 종속성을 ~/android-sdk 에 다운로드하고 설치하는 다음 스크립트를 사용할 수 있습니다.
./installsdk.sh 로그 아웃하고 로그인 한 후 작업이 작동하도록하려면 ANDROID_HOME 환경 변수를 구성하십시오.
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcHTTP 하위 프로젝트는 응용 프로그램의 핵심이며 Android 플랫폼에서 독립적입니다.
실제로 Android 앱은 실험적인 HTTP 프로토콜 구현을보다 실용적으로 사용하려는 시도 일뿐입니다.
설계 목표 중 하나는 다른 라이브러리에 대한 의존성 측면에서 크기가 작고 최소한의 크기를 유지하는 것이 었습니다. 타사 구성 요소가 필요하지 않으며 모든 HTTP 프로토콜 구현은 원시 TCP 소켓에서 읽은 데이터를 기반으로합니다.
ro.polak.http 패키지가 성숙되면 독립 아티팩트로 출시됩니다.
하위 프로젝트는 다음과 같은 방식으로 테스트 할 수 있습니다.
./gradlew :http:clean :http:check -PskipAndroidBuild원래 패키지 코드는 리팩토링되어 단위 및 통합 테스트로 덮여 있습니다. 코드 적용 범위는 90%이상으로 유지되어야합니다.
모든 애플리케이션 코드는 Java 7을 대상으로합니다. 또한 Android SDK 버전 <19에 대해서도 컴파일됩니다 (리소스를 사용하여 시도해보십시오. 스트림을 닫을 때 대안으로 finally 블록에서 iOutilities를 사용하지 않습니다.
또 다른 호환성 제약 조건은 ThreadLocalRandom 대신 Random 사용한다는 것입니다.
돌연변이 테스트는 다음 명령을 실행하여 실행할 수 있습니다.
./gradlew :http:clean :http:pitest -PskipAndroidBuild 그런 다음 결과는 http/build/reports/pitest/ro.polak.http/index.html 및 http/build/reports/pitest/ro.polak.http/mutation.xml 에서 찾을 수 있습니다.
독립형 서버를 사용하여 http 하위 프로 주체를 실행 가능한 서버 구현에 묶을 수 있습니다. CLI 하위 프로젝트는 Android 플랫폼에서도 독립적이며 메인 APK와 번들로 제공되지 않습니다.
./gradlew :cli:bootRun -PskipAndroidBuild하나의 "uber-jar"를 구축하고 독립형 애플리케이션으로 사용할 수도 있습니다.
./gradlew :cli:fatJar -PskipAndroidBuild 그런 다음 결과 인공물은 ./cli/build/libs/cli-all.jar 에서 잡을 수 있습니다.
독립형 서버 용기는 다음 명령으로 모든 컴퓨터에서 실행할 수 있습니다.
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_html사용 가능한 매개 변수의 전체 목록은 httpd.properties를 참조하십시오.

데모 응용 프로그램은 자동으로 Heroku에 배포되며 다음에 연락 할 수 있습니다.
배포 된 응용 프로그램에는 Android에서만 사용할 수 있기 때문에 배포 된 응용 프로그램에는 관리자 응용 프로그램이 포함되어 있지 않습니다 . 배포 설명은 ProcFile을 참조하십시오.
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 );
}
}예제 서블릿은 HTTP/SRC/MAIN/JAVA/예에서 찾을 수 있습니다.
필터를 실질적으로 사용하는 것은 incericfilter.java 및 admin 애플리케이션의 logoutfilter.java에서 확인할 수 있습니다.
DeploymentDescriptorBuilder는 서블릿 매핑 빌딩 및 필터 등록을 쉽게 만드는 것을 목표로하는 전통적인 web.xml 접근법에 대한 API 대안입니다. 아래 코드를 참조하십시오.
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 ();
}
}서빙 정적 리소스는 defaultservlet을 사용하여 구현됩니다
실제 리소스로드는 서버 구성에 인스턴스 리소스 프로보더를 등록하여 구현됩니다.
현재 두 개의 리소스 제공 업체가 구현되었습니다
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 () {
}
}다음 예제는 JTWIG 템플릿 엔진을 통합하는 방법을 제시합니다.
먼저 Gradle 파일에 JTWIG 종속성을 추가해야합니다.
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...그런 다음 상자에서 작동합니다.
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 ());
}
}






실제 SMS를 보내려면 Post Params에서 "& Test = 1"을 제거하십시오.
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는 Fatcow Web Hosting의 아름답게 설계된 "Farm-Fresh Web Icons"팩의 아이콘을 사용합니다! 이 아이콘 세트는 Creative Commons Attribution 3.0 라이센스에 따라 라이센스가 부여됩니다.
이 프로젝트는 GNU GPLV3 라이센스에 공유됩니다.
전용 상업용 라이센스에 관심이 있으시면 piotr [at] polak [dot] ro 에서 라인을 제출하십시오.