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就能看到结果了!

以上就是Java 实现简单静态资源Web服务器的示例的详细内容,更多关于java 实现web服务器的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java服务器端跨域问题解决方案

    这篇文章主要介绍了java服务器端跨域问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在很多开发的 API 都支持 ajax 直接请求,这样就会导致跨域的问题,解决跨域的问题一方面可以从前端,另一方面就是服务器端. 一.Controller类名上方添加@CrossOrigin 注解通过此方式注解则Controller中的所有通过@RequestMapping注解的方法都可以进行跨域请求. 代码如下: @CrossOrigin()

  • Java实现UDP通信过程实例分析【服务器端与客户端】

    本文实例讲述了Java实现UDP通信过程.分享给大家供大家参考,具体如下: TCP是一种面向连接的传输层协议,而UDP是传输层中面向无连接的协议,故传送的数据包不能保证有序和不丢失,实现UDP通信主要用到了两个类:DatagramPacket和DatagramSocket. DatagramSocket 这个类用来表示发送和接收数据包的套接字. //构造方法,创建数据报套接字并将其绑定到本地主机上的指定端口 DatagramSocket socket = new DatagramSocket(0

  • Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对的问题

    1.问题: 昨天把项目打包放到国产中间件东方通(外部容器,功能类似Tomcat)上时,发现某些请求下载文件的接口不能正确返回文件,而是返回一个空的文件,名称是接口名最后一个词fj, 然而这个功能直接使用IDE启动时没问题的,打包放到Tomcat9上也没问题,那可能是东方通适配问题了 2.原代码: 部署在服务器上系统以后,在线打断点,发现跑到这一部分就在第三行位置执行不下去 response.setContentType("application/force-download"); re

  • Java/Android 实现简单的HTTP服务器

    目前在对Android的代码进行功能测试的时候,需要服务器返回一个数据来测试整个流程是否正确.不希望引入第三方的JAR包,因此需要一个特别简单的HTTP服务器. 网上查询了一下,找到可用的代码如下: import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx

  • 详解Java使用Jsch与sftp服务器实现ssh免密登录

    一.什么是SFTP? SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的.但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP. 二.什么是Jsch以及它的作用? Jsch是一个纯粹的用java实现SSH功能的java library.如果要知道Jsch的功

  • Java如何实现上传文件到服务器指定目录

    前言需求 使用freemarker生成的静态文件,统一存储在某个服务器上.本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch.毕竟有现成的就很舒服,在此介绍给大家. 具体实现 引入的pom <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> <

  • java Tcp通信客户端与服务器端实例

    本文实例讲述了java Tcp通信客户端与服务器端.分享给大家供大家参考,具体如下: 由服务器端发送数据 服务器端: import java.io.*; import java.net.*; public class TestSocket { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8888); while(true) { Socket s = ss.accept(); O

  • Java连接Linux服务器过程分析(附代码)

    这篇文章主要介绍了Java连接Linux服务器过程分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pom文件添加依赖 <!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 --> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>

  • Linux服务器Java进程消失问题解决

    这篇文章主要介绍了Linux服务器Java进程消失问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题描述 在实际生产环境下,如果我们遇见Java进程突然消失,该如何去排查问题? 思路 可能有几种原因: ①.Java应用程序的问题:发生OOM导致进程Crash 最常见的是发生堆内存异常"java.lang.OutOfMemoryError: Java heap space",排查步骤如下: Step1: 查看JVM参数 -XX

  • Java下载https文件并上传阿里云oss服务器

    这篇文章主要介绍了Java下载https文件并上传到阿里云oss服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** * @author mazhq * @Title: X509TrustUtiil * @ProjectName: zeus * @Description: 证书信任管理器类 * @d

  • java UDP通信客户端与服务器端实例分析

    本文实例讲述了java UDP通信客户端与服务器端.分享给大家供大家参考,具体如下: 最初Udp是以字节为单位进行传输的,所以有很大的限制 服务器端: import java.net.*; public class TestUdpServer { public static void main(String[] args) throws Exception { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(

  • Java利用TCP协议实现客户端与服务器通信(附通信源码)

    进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的. 上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP.TCP.UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章"盘点那些进行网络编程必须要知道的基础知识",那么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发. TCP协议概念 先来了解一下TCP协议的基本概念. 我们知道TCP是可靠

  • Java负载均衡服务器实现上传文件同步

    负载服务器Z,应用服务器A 和B ,从A上传的附件,如何在B上下载下来? 这个问题我的解决思路如下(后来被一个装逼的面试官给批评了这种做法,不过我瞧不起他) 服务器A.B 上传附件的时候,将这个附件备份到服务器Z ,当A.B下载文件的时候,首先会在自己服务器的目录下寻找,如果找不到,就会从服务器Z 上下载一份到当前服务器. 服务器之间的文件备份通过sftp,参考:https://www.jb51.net/article/196008.htm(下文中的SftpCustom 类就是这个链接里的 "S

随机推荐