手痒就自己实现了一下简易的web服务器,由于只是简易的web服务器,所以并没有什么特别高深的技术含量。

1.      TCP通信(socket)

2.      IO流

3.      线程池技术

服务器架构也简单:

Request类主要是实现解析URL的功能,以获取html文件的路径。

Response类实现读取html文件并且向浏览器输出html文件内容。

Server类整合Request类和Response类,实现线程的run方法。

Test类实现线程池,同时也是服务启动类。

下图是浏览器发给服务器的内容:

下面是效果图:

1.服务器输出的日志

页面效果图:

下面贴一些关键代码:

package request;import java.io.BufferedReader;
import java.io.IOException;public class Request {private String fileroute=null;private BufferedReader br=null;public Request(BufferedReader br) {this.br=br;}public void parse(){String info=null;StringBuffer msg=new StringBuffer();try {while((info=br.readLine())!=null && info.length()>0){//循环读取客户端的信息msg.append(info);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}fileroute=parseFileroute(msg.toString());}//由浏览器发给服务器内容的规律进行读取文件路径private String parseFileroute(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;}//获取html文件名public String getFileroute(){return fileroute;}
}
package response;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;public class Response {private PrintWriter pw=null;private String fileroute=null;public Response(PrintWriter pw, String fileroute) {this.pw=pw;this.fileroute=fileroute;}public void doresponse() {File file=new File("webapp"+fileroute);
//      System.out.println(file.getAbsolutePath());if(!file.exists() || !file.isFile()) //不是文件或不存在return;FileInputStream is=null;InputStreamReader isr=null;BufferedReader br=null;try {is=new FileInputStream(file);isr=new InputStreamReader(is);br=new BufferedReader(isr);String info;StringBuffer msg=new StringBuffer();while((info=br.readLine())!=null && info.length()>0){//循环读取html文件内容msg.append(info);}//将文件内容输出到浏览器pw.write(msg.toString());pw.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{//关闭资源try {if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();} catch (IOException e) {e.printStackTrace();}}}
}
package server;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;import request.Request;
import response.Response;/** 基于TCP协议的Socket通信,实现用户登陆* 服务器端*/
public class Server implements Runnable {private Socket socket=null;public Server(Socket socket) {this.socket=socket;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName()); //输出当前线程名字InputStream is=null;InputStreamReader isr=null;BufferedReader br=null;OutputStream os=null;PrintWriter pw=null;//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口try {//接收请求 进入阻塞状态InetAddress address=socket.getInetAddress();System.out.println("当前客户端的IP:"+address.getHostAddress());System.out.println("当前客户端端口:" + socket.getPort());is=socket.getInputStream();isr=new InputStreamReader(is);br=new BufferedReader(isr);Request request = new Request(br);request.parse();os = socket.getOutputStream();pw = new PrintWriter(os);Response response = new Response(pw, request.getFileroute());response.doresponse();} catch (IOException e) {// TODO: handle exceptione.printStackTrace();} finally {//关闭资源try {if(pw!=null)pw.close();if(os!=null)os.close();if(br!=null)br.close();if(isr!=null)isr.close();if(is!=null)is.close();if(socket!=null)socket.close();} catch (IOException e) {e.printStackTrace();}}}
}
package test;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import server.Server;public class Test {public static void main(String[] args) {ExecutorService pool=null;ServerSocket serverSocket=null;try {serverSocket=new ServerSocket(80);// 创建一个可重用固定线程数的线程池 线程数为5pool = Executors.newFixedThreadPool(5);Socket socket=null;while(true) {socket=serverSocket.accept();//             new Thread(new Server(socket)).start();pool.execute(new Server(socket));}} catch (IOException e) {e.printStackTrace();} finally {if(pool!=null)pool.shutdown();try {if(serverSocket!=null)serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

一个不错的练手项目,涉及到JAVA的IO,Socket,多线程,大家都可以试着实现一下。

简易Web服务器实现相关推荐

  1. PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell

    这篇文章主要介绍了Shell脚本实现的一个简易Web服务器例子分享,本文实现的Web服务器非常简单实用,可以在你不想安装nginx.apache等大型WEB服务器时使用,需要的朋友可以参考下 假设你想 ...

  2. node.js搭建简易Web服务器

    node.js搭建简易Web服务器 node.js简介 Node.js 是一个基于V8引擎的JavaScript 运行环境. V8 是为Google Chrome 提供支持的 JavaScript 引 ...

  3. 手写简易WEB服务器

    手写简易WEB服务器 今天我们来写一个类似于Tomcat的简易服务器.可供大家深入理解一下tomcat的工作原理,本文仅供新手参考,请各位大神指正! 首先我们要准备的知识是: Socket编程 HTM ...

  4. 使用java自制简易web服务器

    微信公众号:进击的蛋糕(dangao123coding) 什么是web服务器 记得好多年前,刚刚开始学javaweb的时候,老师教的第一件事是安装jdk,第二件事就是安装tomcat了. 当时老师的操 ...

  5. TinyWS —— 一个C++写的简易WEB服务器(三)

    写在前面 代码已经托管在 https://git.oschina.net/augustus/TinyWS.git 可以用git clone下来.由于我可能会偶尔做一些修改,不能保证git 库上的代码与 ...

  6. 基于c++的简易web服务器搭建(初尝socket编程)

    实验的目的与要求: 用 Socket 编程实现一个 Web 服务器(端口号 8080) 实验要求: 该 Web 服务器在一台主机上运行,支持多台主机同时访问 有服务控制界面,开启和关闭按钮 能够指定主 ...

  7. web基础知识--简易web服务器的搭建

    文章目录 socket 不同电脑上的进程之间如何通信 什么是socket? 创建socket udp网络程序-发送.接收数据 什么是udp ? udp网络程序-发送数据 udp网络程序-发送.接收数据 ...

  8. 基于ncat的简易web服务器

    首先装一个ncat yum install ncat apt get install ncat whatever... 准备一个html页面文件 data.txt <html><bo ...

  9. python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

    Python简易http服务器源码 import SimpleHTTPServer import SocketServer import sys PORT = 80 if len(sys.argv) ...

最新文章

  1. js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
  2. spring+mybatis之声明式事务管理初识(小实例)
  3. HDU1058 Humble Numbers
  4. LeetCode 247. 中心对称数 II(DP)
  5. jpa onetoone_java – JPA,Hibernate:仅使用外键的OneToOne映...
  6. Android小项目之--应用解析 Content Provider-内容提供商(附源码)
  7. [leetcode] 872. 叶子相似的树(周赛)
  8. Android应用程序版本号管理(官方文档中文版) 2011-08-07 22:03:36
  9. golang实现微信模板消息推送
  10. qq互联代码 php,请教QQ互联的代码是如何写的?
  11. python 自动下载脚本_Python脚本自动下载小说
  12. 安搭Share:霜降来,寒意到
  13. android 按键 免root,按键精灵免root版
  14. unity5.6.5适配Android P刘海屏,两侧去黑边
  15. .pfx格式和.Cer格式的区别
  16. win10系统下jdk环境变量配置
  17. linux上nagios安装完整版
  18. 用JS做10以内的加法(带按钮)
  19. 传感网应用开发(环境部署)
  20. 使用ffmpeg转码m3u8并播放及跨域问题

热门文章

  1. JsonMap对象的获取与前台浏览器报错Uncaught TypeError: Cannot read property ‘map‘ of undefined
  2. [附源码]Python计算机毕业设计大学生体检管理系统
  3. 视频会议传输模块的开发选择
  4. ubuntu 20.04减少磁盘存储以及清除最近历史记录
  5. 深入理解java继承
  6. 8个基本的Docker容器管理命令
  7. linux以16进制打开文件,linux下查看十六进制文件方法
  8. UMP系统架构 Zookeeper
  9. python分类预测降低准确率_【火炉炼AI】机器学习011-分类模型的评估:准确率,精确率,召回率,F1值...
  10. Centos6解决You could try using --skip-broken to work around the problem,rpm -Va --nofiles --nodigest问题