Java/Android 實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器
目前在對(duì)Android的代碼進(jìn)行功能測(cè)試的時(shí)候,需要服務(wù)器返回一個(gè)數(shù)據(jù)來(lái)測(cè)試整個(gè)流程是否正確。不希望引入第三方的JAR包,因此需要一個(gè)特別簡(jiǎn)單的HTTP服務(wù)器。
網(wǎng)上查詢了一下,找到可用的代碼如下:
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.StringTokenizer;
// The tutorial can be found just here on the SSaurel's Blog :
// https://www.ssaurel.com/blog/create-a-simple-http-web-server-in-java
// Each Client Connection will be managed in a dedicated Thread
public class JavaHTTPServer implements Runnable{
static final File WEB_ROOT = new File(".");
static final String DEFAULT_FILE = "index.html";
static final String FILE_NOT_FOUND = "404.html";
static final String METHOD_NOT_SUPPORTED = "not_supported.html";
// port to listen connection
static final int PORT = 8080;
// verbose mode
static final boolean verbose = true;
// Client Connection via Socket Class
private Socket connect;
public JavaHTTPServer(Socket c) {
connect = c;
}
public static void main(String[] args) {
try {
ServerSocket serverConnect = new ServerSocket(PORT);
System.out.println("Server started.\nListening for connections on port : " + PORT + " ...\n");
// we listen until user halts server execution
while (true) {
JavaHTTPServer myServer = new JavaHTTPServer(serverConnect.accept());
if (verbose) {
System.out.println("Connecton opened. (" + new Date() + ")");
}
// create dedicated thread to manage the client connection
Thread thread = new Thread(myServer);
thread.start();
}
} catch (IOException e) {
System.err.println("Server Connection error : " + e.getMessage());
}
}
@Override
public void run() {
// we manage our particular client connection
BufferedReader in = null; PrintWriter out = null; BufferedOutputStream dataOut = null;
String fileRequested = null;
try {
// we read characters from the client via input stream on the socket
in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
// we get character output stream to client (for headers)
out = new PrintWriter(connect.getOutputStream());
// get binary output stream to client (for requested data)
dataOut = new BufferedOutputStream(connect.getOutputStream());
// get first line of the request from the client
String input = in.readLine();
// we parse the request with a string tokenizer
StringTokenizer parse = new StringTokenizer(input);
String method = parse.nextToken().toUpperCase(); // we get the HTTP method of the client
// we get file requested
fileRequested = parse.nextToken().toLowerCase();
// we support only GET and HEAD methods, we check
if (!method.equals("GET") && !method.equals("HEAD")) {
if (verbose) {
System.out.println("501 Not Implemented : " + method + " method.");
}
// we return the not supported file to the client
File file = new File(WEB_ROOT, METHOD_NOT_SUPPORTED);
int fileLength = (int) file.length();
String contentMimeType = "text/html";
//read content to return to client
byte[] fileData = readFileData(file, fileLength);
// we send HTTP Headers with data to client
out.println("HTTP/1.1 501 Not Implemented");
out.println("Server: Java HTTP Server from SSaurel : 1.0");
out.println("Date: " + new Date());
out.println("Content-type: " + contentMimeType);
out.println("Content-length: " + fileLength);
out.println(); // blank line between headers and content, very important !
out.flush(); // flush character output stream buffer
// file
dataOut.write(fileData, 0, fileLength);
dataOut.flush();
} else {
// GET or HEAD method
if (fileRequested.endsWith("/")) {
fileRequested += DEFAULT_FILE;
}
File file = new File(WEB_ROOT, fileRequested);
int fileLength = (int) file.length();
String content = getContentType(fileRequested);
if (method.equals("GET")) { // GET method so we return content
byte[] fileData = readFileData(file, fileLength);
// send HTTP Headers
out.println("HTTP/1.1 200 OK");
out.println("Server: Java HTTP Server from SSaurel : 1.0");
out.println("Date: " + new Date());
out.println("Content-type: " + content);
out.println("Content-length: " + fileLength);
out.println(); // blank line between headers and content, very important !
out.flush(); // flush character output stream buffer
dataOut.write(fileData, 0, fileLength);
dataOut.flush();
}
if (verbose) {
System.out.println("File " + fileRequested + " of type " + content + " returned");
}
}
} catch (FileNotFoundException fnfe) {
try {
fileNotFound(out, dataOut, fileRequested);
} catch (IOException ioe) {
System.err.println("Error with file not found exception : " + ioe.getMessage());
}
} catch (IOException ioe) {
System.err.println("Server error : " + ioe);
} finally {
try {
in.close();
out.close();
dataOut.close();
connect.close(); // we close socket connection
} catch (Exception e) {
System.err.println("Error closing stream : " + e.getMessage());
}
if (verbose) {
System.out.println("Connection closed.\n");
}
}
}
private byte[] readFileData(File file, int fileLength) throws IOException {
FileInputStream fileIn = null;
byte[] fileData = new byte[fileLength];
try {
fileIn = new FileInputStream(file);
fileIn.read(fileData);
} finally {
if (fileIn != null)
fileIn.close();
}
return fileData;
}
// return supported MIME Types
private String getContentType(String fileRequested) {
if (fileRequested.endsWith(".htm") || fileRequested.endsWith(".html"))
return "text/html";
else
return "text/plain";
}
private void fileNotFound(PrintWriter out, OutputStream dataOut, String fileRequested) throws IOException {
File file = new File(WEB_ROOT, FILE_NOT_FOUND);
int fileLength = (int) file.length();
String content = "text/html";
byte[] fileData = readFileData(file, fileLength);
out.println("HTTP/1.1 404 File Not Found");
out.println("Server: Java HTTP Server from SSaurel : 1.0");
out.println("Date: " + new Date());
out.println("Content-type: " + content);
out.println("Content-length: " + fileLength);
out.println(); // blank line between headers and content, very important !
out.flush(); // flush character output stream buffer
dataOut.write(fileData, 0, fileLength);
dataOut.flush();
if (verbose) {
System.out.println("File " + fileRequested + " not found");
}
}
}
以上就是Java/Android 實(shí)現(xiàn)簡(jiǎn)單的HTTP服務(wù)器的詳細(xì)內(nèi)容,更多關(guān)于Java/Android HTTP服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java編寫Http服務(wù)器下載工具
- Java使用NioSocket手動(dòng)實(shí)現(xiàn)HTTP服務(wù)器
- java Socket實(shí)現(xiàn)簡(jiǎn)單模擬HTTP服務(wù)器
- Java 如何實(shí)現(xiàn)一個(gè)http服務(wù)器
- Java模擬實(shí)現(xiàn)HTTP服務(wù)器項(xiàng)目實(shí)戰(zhàn)
- Intellij?IDEA?的maven項(xiàng)目通過(guò)Java代碼實(shí)現(xiàn)Jetty的Http服務(wù)器(推薦)
- Java創(chuàng)建非阻塞的HTTP服務(wù)器的實(shí)現(xiàn)
相關(guān)文章
Spring中的10種事務(wù)失效的常見(jiàn)場(chǎng)景
這篇文章主要介紹了Spring中的10種事務(wù)失效的常見(jiàn)場(chǎng)景,Spring的聲明式事務(wù)功能更是提供了極其方便的事務(wù)配置方式,配合Spring Boot的自動(dòng)配置,大多數(shù)Spring Boot項(xiàng)目只需要在方法上標(biāo)記@Transactional注解,即可一鍵開啟方法的事務(wù)性配置,需要的朋友可以參考下2023-11-11
一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫(kù)的認(rèn)證(springsecurity整合mybatis)
這篇文章主要介紹了一篇文章帶你搞定 springsecurity基于數(shù)據(jù)庫(kù)的認(rèn)證(springsecurity整合mybatis),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
搭建Springboot框架并添加JPA和Gradle組件的方法
這篇文章主要介紹了搭建Springboot框架并添加JPA和Gradle組件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Spring實(shí)現(xiàn)類私有方法的幾個(gè)問(wèn)題(親測(cè)通用解決方案)
現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中,可能需要對(duì)Spring的實(shí)現(xiàn)類的私有方法進(jìn)行測(cè)試。本文給大家分享Spring實(shí)現(xiàn)類私有方法面臨的幾個(gè)問(wèn)題及解決方案,感興趣的朋友跟隨小編一起看看吧2021-06-06

