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,一经查实,立即删除!

相关文章

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

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

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 为命令行和…

进程间通讯的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;提高用户访问网站的响应速度。…

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

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

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

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

表达式树练习实践:入门基础

什么是表达式树来自微软官方文档的定义&#xff1a;表达式树以树形数据结构表示代码。它能干什么呢&#xff1f;你可以对表达式树中的代码进行编辑和运算。这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。好不好玩&#xff1f;表达式树还能用于动…

Servlet与线程安全

Servlet与线程安全 先说结论&#xff0c;Servlet本身是单例的&#xff0c;线程安全的。但是如果引入共享变量&#xff0c;则可能会变得线程不安全。 1. 什么是线程安全 首先说明一下对线程安全的讨论&#xff0c;哪种情况我们可以称作线程安全&#xff1f; 《Java并发编程实…

尝鲜体验 VS Code Python 原生 Jupyter Notebook 支持

9 月 21 日&#xff0c;PyCon China 2019 在上海举办。微软的 VS Code 发布了原生的Juypter Notebook 支持。 虽然要等到月底 Marketplace 里面才会正式更新&#xff0c;但 GitHub 上的 repo 已经包含了相应的 commit&#xff0c;所以还是可以通过手动安装的方式尝鲜。现有 VSC…

Java Web之filter、listener、Interceptor

** 1、Servlet ** Servlet 是服务端的 Java 应用程序&#xff0c;用于处理HTTP请求&#xff0c;做出相应的响应。 当客户端向服务器发出HTTP请求时&#xff0c;首先会由服务器中的 Web 容器&#xff08;如Tomcat&#xff09;对请求进行路由&#xff0c;交给该URL对应的 Servl…

abp vNext微服务框架分析

abp vNext新框架的热度一直都很高&#xff0c;于是最近上手将vNext的微服务Demo做了一番研究。我的体验是&#xff0c;vNext的微服务架构确实比较成熟&#xff0c;但是十分难以上手&#xff0c;对于没有微服务开发经验的.net人员来说几乎是看不懂的&#xff0c;所以研究一番后再…

.NET Conf 2019日程(北京时间)

一年一度的 .NET Conf马上就要开始了,我将日程简易的翻译了一下,并且时间全部转换为北京时间,以方便国内.NETer.第1天 (北京时间9月24日).NET Conf 2019 基调 - Scott Hunter Mads Torgersen James Montemagno Olia Gavrysh Daniel Roth Glenn Condron Bri Achtman欢迎来到 .NE…

Hibernate基础

** 一、什么是Hibernate&#xff1f; **   Hibernate是一个轻量级的ORMapping框架   ORMapping原理&#xff08;Object Relational Mapping&#xff09; ORMapping基本对应规则&#xff1a; 1&#xff1a;类跟表相对应2&#xff1a;类的属性跟表的字段相对应3&#xff1…

进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 《进击的 Java &#xff0c;云原生时代的蜕变》, 本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。.NET 生态系统是一个不断变化的生态圈&#xff0c;我相信它正在朝着一个伟大的方向发…

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础&#xff0c;传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候&#xff0c;在默认情况下&#xff0c;返回的只是该对象的代理对象&#xff0c;当用户去使用该对象的属性时&#xff0c;才会向数据库再一次发出查询语…

程序员过关斩将--要想获取我的用户信息,就得按照规矩来

菜菜君&#xff0c;我又来啦又有什么事吗&#xff1f;我按照你上篇文章写的JWT的方式已经把网站认证写完了&#xff0c;而且效果还不错那恭喜你呀&#xff0c;下次面试又多了一项技能不过&#xff0c;现在又有一个问题&#xff0c;我做的系统有一个合作商想要利用我们的用户信息…

E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me! ∑i1n∑j1nϕ(aiaj)d(i,j)设paii∑i1n∑j1nϕ(ij)d(pi,pj)∑i1n∑j1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))gcd⁡(i,j)d(pi,pj)∑d1ndϕ(d)∑i1nd∑j1ndϕ(id)ϕ(jd)d(pid,pjd)[gcd⁡(i,j)1]∑d1ndϕ(d)∑k1ndμ(k)∑i1nkd∑j1nkdϕ(ikd)ϕ(jkd)d(pikd,pjkd)Tkd∑T1n(∑i1n…