Java写一个简单的静态文件的HTTP服务器(基于Socket)

**

一、实现思路

**

  • 1、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象。

  • 2、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求。

  • 3、获得浏览器请求,解析资源文件路径。

  • 4、读取资源文件,响应给浏览器。

**

二、代码实现

**

1、ServerSocket 监听端口,获取 Socket对象

package com.httpserver.two;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*** @description: 使用socket 自己写一个web服务器 ---监听端口,获取socket 对象。* @version:v1.0* @author:w* @date:2018年6月6日上午11:03:36**/
public class WebServer {public void startServer(int port){try {@SuppressWarnings("resource")ServerSocket serverSocket = new ServerSocket(port);while(true){Socket socket = serverSocket.accept();new HttpServer(socket).start();}} catch (IOException e) {e.printStackTrace();}}
}

2、HttpServer.java类 — 具体作用看方法注释

package com.httpserver.two.fix;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
/*** @description: 使用socket 实现 web服务器 --- 具体执行读写操作的。<br>* 	fix: 1、换行符写错误:"/r/n" 调整为正确: "\r\n"。 <br>* 		 2、"HTTP /1.1 200 ok" 中,"HTTP"和"/1.1" 直接不能有空格,否则 Firefox无法解析。<br>* @version:v1.1* @author:w* @date:2018年12月18日 16:50:28*/
public class HttpServerFix extends Thread {/*** web资源根路径*/public static final String ROOT = "c:/";/*** 输入流对象,读取浏览器请求*/private InputStream input;/*** 输出流对象,响应内容给浏览器*/private OutputStream out;/*** @description:初始化socket对象,获取对应 输入,输出流* @param socket*/public HttpServerFix(Socket socket) {try {input = socket.getInputStream();out = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}}/*** 多线程方法调用*/@Overridepublic void run() {String filePath = read();response(filePath);}/*** @description: 读取资源文件,响应给浏览器。* @param:@param filePath*                   资源文件路径* @return:void* @version:v1.0* @author:w* @date:2018年6月6日 上午11:42:37**/private void response(String filePath) {File file = new File(ROOT + filePath);if (file.exists()) {// 1、资源存在,读取资源try {BufferedReader reader = new BufferedReader(new FileReader(file));StringBuffer sb = new StringBuffer();String line = null;while ((line = reader.readLine()) != null) {System.out.println("line:"+ line);sb.append(line).append("\r\n");}StringBuffer result = new StringBuffer();/*** 1、 换行符"/r/n"写错了,正确的是: "\r\n"* 2、"HTTP /1.1 ..."之间不能有空格,否则Firfox不能解析* 3、 关于换行符的补充:* 	  a.windows:"\r\n"*    b.linux:"\n"*    c.mac:"\r" *///	result.append("HTTP /1.1 200 ok /r/n");result.append("HTTP/1.1 200 ok \r\n");result.append("Content-Language:zh-CN \r\n");// charset=UTF-8 解决中文乱码问题result.append("Content-Type:text/html;charset=UTF-8 \r\n");result.append("Content-Length:" + file.length() + "\r\n");result.append("\r\n" + sb.toString());out.write(result.toString().getBytes());out.flush();out.close();} catch (Exception e) {e.printStackTrace();}} else {// 2、资源不存在,提示 file not foundStringBuffer error = new StringBuffer();error.append("HTTP/1.1 400 file not found \r\n");error.append("Content-Type:text/html \r\n");error.append("Content-Length:20 \r\n").append("\r\n");error.append("<h1 >File Not Found..</h1>");try {out.write(error.toString().getBytes());out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}/*** * @description:解析资源文件路径* @example: GET /index.html HTTP/1.1* @param:@return* @return:String* @version:v1.0* @author:w* @date:2018年6月6日 上午11:39:42**/private String read() {BufferedReader reader = new BufferedReader(new InputStreamReader(input));try {// 读取请求头, 如:GET /index.html HTTP/1.1String readLine = reader.readLine();String[] split = readLine.split(" ");if (split.length != 3) {return null;}System.out.println(readLine);return split[1];} catch (IOException e) {e.printStackTrace();}return null;}}

**

三、代码测试

**

1、启动服务器

public static void main(String[] args) {new WebServer().startServer(8000);
}

2、浏览器地址栏输入: http://localhost:8000/index.html

3、效果如下:

在这里插入图片描述

**

四、总结

**

  • 1、该示例代码可直接粘贴IDE中运行,无需任何第三方jar包。 简单简洁,便于理解。

  • 2、c盘中,必须有一个 index.html的文件,若存放在其他位置,请修改 HttpServer.ROOT字段,路径位置即可。

  • 3、若出现请求成功,响应页面为空白,请去掉 index.html 页面的 标签试试。— 至于什么问题导致的,目前还不清楚。 -_-!

4、 index.html 代码参考

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><h1>Hello World! this is my webserver!</h1>
</body>

五、拓展:加上cookie、session机制

//TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2839 [国家集训队]middle(二分 套 主席树)

P2839 [国家集训队]middle 有一个长度为nnn的序列&#xff0c;有mmm次询问&#xff0c;每次询问a,b,c,da, b, c, da,b,c,d&#xff0c;为l∈[a,b],r∈[c,d]l \in [a, b], r \in [c, d]l∈[a,b],r∈[c,d]&#xff0c;[l,r][l, r][l,r]区间的中位数最大是多少&#xff0c;强制在…

asp.net core 使用HttpClientFactory Polly实现熔断降级

前言在NET Core2.1后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式通常不是最好的选择。处理HttpClient,底层socket套接字不会立即释放。该HttpClient类是未多个请求重复使用而创建的。…

.NET生态系统概览

本文要点.NET 5 预计会在 2020 年发布&#xff0c;届时将统一所有.NET 平台。在进行特性开发时优先考虑性能。C#语言的发展直接推动了开发者的采用。开源社区让.NET 生态系统变得更好。2002 年&#xff0c;.NET 发布。在接下来的 12 年多时间里&#xff0c;.NET 开发社区以看似…

P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)

P1848 [USACO12OPEN]Bookshelf G 有nnn间物品&#xff0c;每个物品有两个属性Wi,HiW_i, H_iWi​,Hi​&#xff0c;宽度跟高度&#xff0c;要求把这nnn件物品划分成若干连续的组&#xff0c;每组内∑Wi≤L\sum\limits W_i \leq L∑Wi​≤L&#xff0c;并且要求最小化每组最大高…

Java 实现 FTP 服务

1、FTP简介 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的…

L. Continuous Intervals(单调栈 + 线段树 + 思维)

L. Continuous Intervals 给定一个长度为nnn的数组&#xff0c;问里面有多少个区间[l,r][l, r][l,r]&#xff0c;满足&#xff0c;对这个区间排序后&#xff0c;两两差值$ \leq 1$&#xff0c;输出区间个数。 如果说区间[l,r][l, r][l,r]是符合要求的&#xff0c;则满足max(a…

Azure Application Insights REST API使用教程

本文是Azure Application Insights REST API的简单介绍&#xff0c;并会包含一个通过Python消费API的示例/小工具。新加入的team中的一项工作是制作日常的运维报表&#xff0c;制作方式是手工前往portal.azure.com&#xff0c;在网页中多次执行不同的查询语句、导出excel&#…

用Java Socket实现SMTP邮件发送

目录&#xff1a; 1、邮件基础概念2、Java Mail API介绍3、收发邮件代码示例 PS&#xff1a;如果你想直接拿代码用&#xff0c;可以直接跳到第3部分。 ** 一、邮件基础概念 ** 1.1 邮件服务器和电子邮箱 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件…

微软开源新字体Cascadia Code,源于Windows Terminal

微软开源了一套新的字体 Cascadia Code。Cascadia Code 是微软在 5 月份的 Build 大会上宣布推出的等宽字体&#xff0c;微软介绍它是与新的终端 Windows Terminal 一起开发的&#xff0c;官方建议将其与终端应用和 VS、VS Code 等文本编辑器一起使用。Cascadia Code 为命令行和…

C. Safe Distance(二分 + 并查集)

C. Safe Distance&#xff08;二分 并查集&#xff09; 给定一个XYX \times YXY的矩形&#xff0c;里面有n,(1≤n≤1000)n,(1 \leq n \leq 1000)n,(1≤n≤1000)个点&#xff0c;我们要从点(0,0)(0, 0)(0,0)走到(X,Y)(X, Y)(X,Y)&#xff0c;我们要使过程中与这nnn个点的最小距…

进程间通讯的7种方式

1、常见的通信方式 管道pipe&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO&#xff1a;有名管道也是半双工的通信方式&#xff0c;但是它允许无亲缘…

官宣!VS Code Python 全新功能在 PyCon China 全球首发!

北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师在演讲中&#xff0c;我们看到了 Azure Notebook 与 VS Code 对 Python 的强大的支持。然而&#xff0c;鱼和熊掌似乎不可兼得。Jupyt…

什么是CDN

一、cdn简介 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其目的是通过在现有的internet中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络边缘&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的响应速度。…

数列递推(牛客练习赛83)(数学、分块)

数列递推 给定f(0)f(0)f(0)&#xff0c;定义fn∑i1nf(nmodi)f_n \sum\limits_{i 1} ^{n} f_{(n \mod i)}fn​i1∑n​f(nmodi)​&#xff0c;求f1,f2,f3,…,fn−1,fnf_1, f_2, f_3, \dots, f_{n - 1}, f_{n}f1​,f2​,f3​,…,fn−1​,fn​。 ∑i1nf(nmodi)∑i1nf(n−nii)\su…

DNS基础

域名注册完成后首先需要做域名解析&#xff0c;域名解析就是把域名指向网站所在服务器的IP&#xff0c;让人们通过注册的域名可以访问到网站。IP地址是网络上标识服务器的数字地址&#xff0c;为了方便记忆&#xff0c;使用域名来代替IP地址。域名解析就是域名到IP地址的转换过…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址: https://liningit.github.io/LnskyDB/开源地址: https://github.com/liningit/LnskyDBnuget地址: https://www.nuget.org/packages/LnskyDB…

CF1422F Boring Queries(ST表 + 主席树)

CF1422F Boring Queries 给定一个长度为nnn的数组a,(1≤ai≤2105)a,(1 \leq a_i \leq 2 \times 10 ^ 5)a,(1≤ai​≤2105)&#xff0c;有mmm次询问&#xff0c;每次询问给定l,rl, rl,r&#xff0c;要我们求区间[l,r][l, r][l,r]&#xff0c;aia_iai​的lcmlcmlcm&#xff0c;强…

高性能最终一致性框架Ray之基本概念原理

一、Actor介绍Actor是一种并发模型&#xff0c;是共享内存并发模型的替代方案。共享内存模型的缺点&#xff1a;共享内存模型使用各种各样的锁来解决状态竞争问题&#xff0c;性能低下且让编码变得复杂和容易出错。共享内存受限于单节点的服务器资源限制。Actor模型的优点&…

B.The Tortoise and the Hare 长春

B. The Tortoise and the Hare 给定一个长度为nnn的数组a,(1≤ai<m)a, (1 \leq a_i < m)a,(1≤ai​<m)&#xff0c;mmm是一个给定的数(1≤m≤109)(1 \leq m \leq 10 ^ 9)(1≤m≤109)&#xff0c;有QQQ次操作&#xff0c;分为两类&#xff1a; 给定u,v,(1≤u≤n,1≤v…

漫画:程序员带娃日常(1)

我是一名IT界资深人士做过乙方苦哈哈做过甲方做过项目、搞点管理做过培训、也上台演讲不过现在最大挑战、交期最长的项目是。。。带 娃娃子啊&#xff0c;爸爸也是第一次当爸爸&#xff0c;要请你多多指教啦&#xff01;1“小刘&#xff0c;把这个需求细化一下。”“兄弟们&…