NanoHttpd Home:
https://github.com/NanoHttpd/nanohttpd
Tiny, easily embeddable HTTP server in Java. (single source file)
1. WebServer Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.Status;
public class WebServer extends NanoHTTPD {
NanoHTTPD nano;
String baseFolder;
public static void main(String[] args) {
try {
WebServer nano = new WebServer(8880);
nano.setBaseFolder("D:\\Temp");
nano.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
} catch (IOException ioe) {
System.err.println("Couldn't start server:\n" + ioe);
}
}
public WebServer(int port) throws IOException {
super(port);
System.out.println("\nRunning! Point your browsers to http://localhost:8080/ \n");
}
public void setBaseFolder(String folder) {
baseFolder = folder;
}
private String trimPrefix(String text, String prefix) {
if( text.startsWith(prefix) ) {
text = text.substring(prefix.length());
}
return text;
}
private String getDirectoryList(File folder, String uri) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
File[] files = folder.listFiles();
StringBuilder sb = new StringBuilder();
sb.append("<html><head><style type=\"text/css\" scoped>\r\n" +
" table, th, td { border: 1px solid gray; border-collapse: collapse; } \r\n" +
" a { text-decoration: none;\r\n" +
" } \r\n" +
"</style></head><body>\r\n"+
"<h5> Folder: "+uri+"</h5>\r\n" +
"<table><thead>\r\n" +
"<tr>\r\n" +
" <th>Filename</th>\r\n" +
" <th>Size <small>(bytes)</small></th>\r\n" +
" <th>Date Modified</th>\r\n" +
"</tr>\r\n" +
"</thead><tbody>");
if( ! folder.equals(new File(baseFolder)) ) {
sb.append("<tr>\r\n");
sb.append("<td><a href=\"" + trimPrefix(folder.getParent(), baseFolder) + "\">..</a></td>");
sb.append("<td align=\"right\"><DIR></td>");
sb.append("<td> </td>");
sb.append("</tr>\r\n");
}
for( File file : files ) {
sb.append("<tr>\r\n");
sb.append("<td><a href=\"" + trimPrefix(file.getPath(), baseFolder) + "\">"); sb.append(file.getName()); sb.append("</a></td>");
if( file.isDirectory() ) {
sb.append("<td align=\"right\"><DIR></td>");
} else {
sb.append("<td align=\"right\">"); sb.append(""+file.length()); sb.append("</td>");
}
sb.append("<td>"); sb.append(""+sdf.format(file.lastModified())); sb.append("</td>");
sb.append("</tr>\r\n");
}
sb.append("</tbody></table></body></html>");
System.out.println("RESPONSE: " + sb.toString());
return sb.toString();
}
@Override
public Response serve(IHTTPSession session) {
System.out.println("URI: " + session.getUri());
String uri = session.getUri();
File file = new File(baseFolder, uri);
if( file.isDirectory() ) {
return newFixedLengthResponse(getDirectoryList(file,uri));
} else {
try {
return newFixedLengthResponse(Status.OK, NanoHTTPD.MIME_PLAINTEXT, new FileInputStream(file), file.length());
} catch (FileNotFoundException e) {
e.printStackTrace();
return newFixedLengthResponse("");
}
}
}
}
|
Output: