Java 实现简单静态资源Web服务器的示例
作者:派大星 发布时间:2021-06-16 17:12:55
标签:java,静态资源,web,服务器
需求
有时候我们想快速通过http访问本地的一些资源,但是安装一些web服务器又很费时和浪费资源,而且也不是长期使用的。
这时候我们可以启动一个小型的java服务器,快速实现一个http的静态资源web服务器。
难点
其实没什么难点,主要是注意请求头和返回头的处理。然后将请求的文件以流的方式读入返回outputstream即可。
代码
直接上代码吧~
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ResourceWebServer {
private static final int SERVER_PORT = 8888;
private static final int MAX_CONNECTION_LENGTH = 1;
public static void main(String[] args) throws IOException {
log("======服务器启动=====");
ResourceWebServer server = new ResourceWebServer();
server.startServer();
}
public void startServer() throws IOException {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT, MAX_CONNECTION_LENGTH, InetAddress.getByName("localhost"));
log("======准备接收请求=====");
while (true) {
Socket socket = serverSocket.accept();
try (InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream()) {
String requestUri = getRequestUri(inputStream);
log("请求文件:" + requestUri);
writeHeaders(outputStream);
Path path = Paths.get(getClass().getClassLoader().getResource(requestUri.substring(1)).toURI());
Files.copy(path, outputStream);
} catch (Exception e) {
log("发生错误啦!");
e.printStackTrace();
}
}
}
private void writeHeaders(OutputStream outputStream) throws IOException {
//必须包含返回头,否则浏览器不识别
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
//一个\r\n代表换行添加新的头,2次\r\n代表头结束
outputStream.write("Content-Type: text/html\r\n\r\n".getBytes());
}
private String getRequestUri(InputStream inputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder(2048);
byte[] buffer = new byte[2048];
int size = inputStream.read(buffer);
for (int i = 0; i < size; i++) {
stringBuilder.append((char) buffer[i]);
}
String requestUri = stringBuilder.toString();
//此时的uri还包含了请求头等信息,需要去掉
//GET /index.html HTTP/1.1...
int index1, index2;
index1 = requestUri.indexOf(" ");
if (index1 != -1) {
index2 = requestUri.indexOf(" ", index1 + 1);
if (index2 > index1) {
return requestUri.substring(index1 + 1, index2);
}
}
return "";
}
private static void log(Object object) {
System.out.println(object);
}
}
接下来,就可以在resource文件下放入静态资源啦,比如放一个index.html
然后启动,打开浏览器输入http://localhost:8888/index.html就能看到结果了!
来源:https://www.wanaright.com/2018/11/29/java-quick-web-service/


猜你喜欢
- ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列
- 本文实例讲述了Android编程实现WebView自适应全屏的方法。分享给大家供大家参考,具体如下:第一种:settings.setUseW
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如
- 这篇文章主要介绍了Java中的3种输入方式实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 本文实例讲述了C#实现图形区域组合操作的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.C
- java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟。话不多说,上代码: @Test
- 前言这段时间比较闲,就看起了jdk源码。一般的一个高级开发工程师, 能阅读一些源码对自己的提升还是蛮大的。本文总结了一些JDK源码中的“小技
- 目前html5发展非常迅速,很多native app都会嵌入到网页中,以此来适用多变的市场需求。但是android的webview默认支持的
- 在用C++来开发Windows程序时,经常看到下面的判断情况:HRESULT hr = ::RegCreateKeyEx(hk, szKey
- 用了MyBatis的同行,应该见过foreach,它一般是这样用的:<select id="foreachTest"
- 第一节 接口慨述接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语
- 应用场景:当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退给买家,微信支付将在收到退款请求并且验证
- 对于一个简单的tcp通讯这里我就不再讲述了,今天主要为大家讲解下,如何从::recv中筛选出一个完整包逻辑。就简单的以客户端为例(服务器接收
- 原因:给定的流不支持mark和reset就会报这个错误。获取到一个网络流,这个网络流不允许读写头来回移动,也就不允许mark/reset机制
- 需求是需要在TextView前端加入一个标签展示。最终效果图如下:根据效果图,很容易就能想到使用SpannableStringBuilder
- 本文实例讲述了C#静态static的用法,分享给大家供大家参考。具体用法分析如下:一、静态类静态类与非静态类的重要区别在于静态类不能实例化,
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 1.前言string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢?原因就是
- springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
- Filter过滤器和Listener * 详解Filter过滤器Filter的简介 对资源的访问进行过滤,相当于小区的保安,进去