android java server_Java/Android 实现简单的HTTP服务器

这篇博客展示了如何在Android环境中使用Java实现一个简单的HTTP服务器。通过创建一个线程来处理每个客户端连接,服务器监听8080端口,支持GET和HEAD请求。当请求的文件不存在或方法不被支持时,服务器会返回相应的错误页面。
摘要由CSDN通过智能技术生成

目前在对Android的代码进行功能测试的时候,需要服务器返回一个数据来测试整个流程是否正确。不希望引入第三方的JAR包,因此需要一个特别简单的HTTP服务器。

网上查询了一下,找到可用的代码如下:

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 实现简单的HTTP服务器的详细内容,更多关于Java/Android HTTP服务器的资料请关注脚本之家其它相关文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值