前言

一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现;

程序执行步骤

  1. 创建一个ServerSocket对象;
  2. 调用ServerSocket对象的accept方法,等待连接,连接成功会返回一个Socket对象,否则一直阻塞等待;
  3. 从Socket对象中获取InputStream和OutputStream字节流,这两个流分别对应request请求和response响应;
  4. 处理请求:读取InputStream字节流信息,转成字符串形式,并解析,这里的解析比较简单,仅仅获取uri(统一资源标识符)信息;
  5. 处理响应:根据解析出来的uri信息,从WEB_ROOT目录中寻找请求的资源资源文件, 读取资源文件,并将其写入到OutputStream字节流中;
  6. 关闭Socket对象;
  7. 转到步骤2,继续等待连接请求;

代码实现

服务器实现:

package ex01.pyrmont;import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.File;public class HttpServer {/*** WEB_ROOT是HTML和其它文件存放的目录. 这里的WEB_ROOT为工作目录下的webroot目录*/public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";// 关闭服务命令private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";public static void main(String[] args) {HttpServer server = new HttpServer();//等待连接请求
        server.await();}public void await() {ServerSocket serverSocket = null;int port = 8080;try {//服务器套接字对象serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));} catch (IOException e) {e.printStackTrace();System.exit(1);}// 循环等待一个请求while (true) {Socket socket = null;InputStream input = null;OutputStream output = null;try {//等待连接,连接成功后,返回一个Socket对象socket = serverSocket.accept();input = socket.getInputStream();output = socket.getOutputStream();// 创建Request对象并解析Request request = new Request(input);request.parse();// 检查是否是关闭服务命令if (request.getUri().equals(SHUTDOWN_COMMAND)) {break;}// 创建 Response 对象Response response = new Response(output);response.setRequest(request);response.sendStaticResource();// 关闭 socket 对象
                socket.close();} catch (Exception e) {e.printStackTrace();continue;}}}
}

Request类:

package ex01.pyrmont;import java.io.InputStream;
import java.io.IOException;public class Request {private InputStream input;private String uri;public Request(InputStream input) {this.input = input;}//从InputStream中读取request信息,并从request中获取uri值public void parse() {StringBuffer request = new StringBuffer(2048);int i;byte[] buffer = new byte[2048];try {i = input.read(buffer);} catch (IOException e) {e.printStackTrace();i = -1;}for (int j = 0; j < i; j++) {request.append((char) buffer[j]);}System.out.print(request.toString());uri = parseUri(request.toString());}/*** * requestString形式如下:* GET /index.html HTTP/1.1* Host: localhost:8080* Connection: keep-alive* Cache-Control: max-age=0* ...* 该函数目的就是为了获取/index.html字符串*/private String parseUri(String requestString) {int index1, index2;index1 = requestString.indexOf(' ');if (index1 != -1) {index2 = requestString.indexOf(' ', index1 + 1);if (index2 > index1)return requestString.substring(index1 + 1, index2);}return null;}public String getUri() {return uri;}}

Response类:

package ex01.pyrmont;import java.io.OutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.File;/*HTTP Response = Status-Line*(( general-header | response-header | entity-header ) CRLF)CRLF[ message-body ]Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
*/public class Response {private static final int BUFFER_SIZE = 1024;Request request;OutputStream output;public Response(OutputStream output) {this.output = output;}public void setRequest(Request request) {this.request = request;}public void sendStaticResource() throws IOException {byte[] bytes = new byte[BUFFER_SIZE];FileInputStream fis = null;try {//将web文件写入到OutputStream字节流中File file = new File(HttpServer.WEB_ROOT, request.getUri());if (file.exists()) {fis = new FileInputStream(file);int ch = fis.read(bytes, 0, BUFFER_SIZE);while (ch != -1) {output.write(bytes, 0, ch);ch = fis.read(bytes, 0, BUFFER_SIZE);}} else {// file not foundString errorMessage = "HTTP/1.1 404 File Not Found\r\n" + "Content-Type: text/html\r\n"+ "Content-Length: 23\r\n" + "\r\n" + "<h1>File Not Found</h1>";output.write(errorMessage.getBytes());}} catch (Exception e) {// thrown if cannot instantiate a File object
            System.out.println(e.toString());} finally {if (fis != null)fis.close();}}
}

结果测试

访问存在的资源文件(注意存放在工程目录的webroot文件夹里):

访问不存在的资源文件:

关闭服务器:

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5602171.html,如需转载请自行联系原作者

一个简单的Java web服务器实现相关推荐

  1. 一个简单的静态web服务器实现

    看完tomcat原理后,想自己用java仿一个简单的tomcat,先实现一个静态的web服务器.需要的技术有java网络编程(tcp/ip协议.http协议.socket等基础知识) 源码下载链接ht ...

  2. 一个简单的静态web服务器

    用python的socket写的一个简单多进程服务器 #-*-coding:utf-8-*- import re from socket import * from multiprocessing i ...

  3. 一个简单的动态web服务器

    这个动态web服务器的思路是在静态服务器的基础上添加对URL的判断,如果URL中带有脚本信息,那么服务器会去执行脚本而不是直接返回静态界面 #-*-coding:utf-8-*- import sys ...

  4. java web容器_java-实现一个简单的java Web容器

    技术栈 java.net.Socket java.net.ServerSocket 执行流程 创建一个ServerSocket对象: 调用ServerSocket对象的accept方法,等待连接,连接 ...

  5. Java web 服务器 搭建_搭建一个java web服务端

    最近也是做了一个简单的java web 项目,由于以前也是没接触过,在这里记录下搭建一个web服务端的过程. 一般我们做一个服务端要么在本地自己的电脑上先安装环境,一般是windows系统,主要安装j ...

  6. javaweb中服务器响应,Java Web服务器响应与JSON

    我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...

  7. Java的echo_简单的Java echo服务器问题

    我正在尝试编写我的第一个套接字服务器,所以我决定从一个非常简单的事情开始,只是为了计算流程:)我正在编写一个简单的 java echo服务器,但问题是(出于某种原因?! )我没有在客户端获得服务器响应 ...

  8. Linux Java Web 服务器搭建之tomcat安装

    Linux Java Web 服务器搭建之tomcat安装 一 Tomcat 简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是 ...

  9. 常见的Java WEB服务器

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的We ...

最新文章

  1. JavaScript跨域总结与解决办法
  2. stm32F042 (二) 按键触发中断
  3. Springboot [日志管理LogBack]
  4. 基于Spring AOP的JDK动态代理和CGLIB代理
  5. 获取apk安装包sha1的值
  6. TCP/IP协议详解 卷一(阅读指导)
  7. 【笔记】通过 js——实现 各种跨域
  8. 畅通工程(HDU-1232)
  9. 【干货笔记】Generating Question-Answer Hierarchies阅读笔记
  10. 解决XP精简版(无IIS的XP系统)安装IIS服务器的问题
  11. 基于JavaEE电子商务交易系统
  12. Photoshop 安装 Topaz 滤镜
  13. 北京林业大学计算机考研录取分数线,北京林业大学信息学院计算机技术(专业学位)专业考研招生人数 考研报录比 考研复试分数线 考研辅导.pdf...
  14. 在python3 encode和decode 的使用
  15. aws mysql 多区_Amazon RDS 多可用区部署
  16. Java 老矣,尚能饭否?
  17. jtable如何从表格中定位_ja中怎样将一个JTable表中的指定行添加到数据库
  18. neo4j 机器学习_21个必知的机器学习开源工具,涵盖5大领域
  19. python 实现csdn平台自动化定时评论功能实现
  20. python实现手写体数字识别

热门文章

  1. 家长不知道孩子在学校学的咋样,怎么能得行?
  2. 网络安全中的AI:2021年的六个注意事项
  3. 「杂谈」同学聚会最悲哀的事情
  4. SAP SD基础知识之SD常用BAPI
  5. 「NLP」 NLP中应用最广泛的特征抽取模型-LSTM
  6. 盯住未来!揭秘英特尔的AI芯片生意
  7. 未来的房地产,一边香港化,一边鹤岗化
  8. 吴恩达深度学习笔记(83)-LeNet-5、AlexNet和VGGNet网络知多少
  9. 理解五个基本概念,让你更像机器学习专家
  10. SAP MM 物料主数据采购视图中的字段'Var. OUn'的作用?