简易Web服务器实现
手痒就自己实现了一下简易的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服务器实现相关推荐
- PHP服务器脚本实例,Shell脚本实现的一个简易Web服务器例子分享_linux shell
这篇文章主要介绍了Shell脚本实现的一个简易Web服务器例子分享,本文实现的Web服务器非常简单实用,可以在你不想安装nginx.apache等大型WEB服务器时使用,需要的朋友可以参考下 假设你想 ...
- node.js搭建简易Web服务器
node.js搭建简易Web服务器 node.js简介 Node.js 是一个基于V8引擎的JavaScript 运行环境. V8 是为Google Chrome 提供支持的 JavaScript 引 ...
- 手写简易WEB服务器
手写简易WEB服务器 今天我们来写一个类似于Tomcat的简易服务器.可供大家深入理解一下tomcat的工作原理,本文仅供新手参考,请各位大神指正! 首先我们要准备的知识是: Socket编程 HTM ...
- 使用java自制简易web服务器
微信公众号:进击的蛋糕(dangao123coding) 什么是web服务器 记得好多年前,刚刚开始学javaweb的时候,老师教的第一件事是安装jdk,第二件事就是安装tomcat了. 当时老师的操 ...
- TinyWS —— 一个C++写的简易WEB服务器(三)
写在前面 代码已经托管在 https://git.oschina.net/augustus/TinyWS.git 可以用git clone下来.由于我可能会偶尔做一些修改,不能保证git 库上的代码与 ...
- 基于c++的简易web服务器搭建(初尝socket编程)
实验的目的与要求: 用 Socket 编程实现一个 Web 服务器(端口号 8080) 实验要求: 该 Web 服务器在一台主机上运行,支持多台主机同时访问 有服务控制界面,开启和关闭按钮 能够指定主 ...
- web基础知识--简易web服务器的搭建
文章目录 socket 不同电脑上的进程之间如何通信 什么是socket? 创建socket udp网络程序-发送.接收数据 什么是udp ? udp网络程序-发送数据 udp网络程序-发送.接收数据 ...
- 基于ncat的简易web服务器
首先装一个ncat yum install ncat apt get install ncat whatever... 准备一个html页面文件 data.txt <html><bo ...
- python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...
Python简易http服务器源码 import SimpleHTTPServer import SocketServer import sys PORT = 80 if len(sys.argv) ...
最新文章
- js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
- spring+mybatis之声明式事务管理初识(小实例)
- HDU1058 Humble Numbers
- LeetCode 247. 中心对称数 II(DP)
- jpa onetoone_java – JPA,Hibernate:仅使用外键的OneToOne映...
- Android小项目之--应用解析 Content Provider-内容提供商(附源码)
- [leetcode] 872. 叶子相似的树(周赛)
- Android应用程序版本号管理(官方文档中文版) 2011-08-07 22:03:36
- golang实现微信模板消息推送
- qq互联代码 php,请教QQ互联的代码是如何写的?
- python 自动下载脚本_Python脚本自动下载小说
- 安搭Share:霜降来,寒意到
- android 按键 免root,按键精灵免root版
- unity5.6.5适配Android P刘海屏,两侧去黑边
- .pfx格式和.Cer格式的区别
- win10系统下jdk环境变量配置
- linux上nagios安装完整版
- 用JS做10以内的加法(带按钮)
- 传感网应用开发(环境部署)
- 使用ffmpeg转码m3u8并播放及跨域问题
热门文章
- JsonMap对象的获取与前台浏览器报错Uncaught TypeError: Cannot read property ‘map‘ of undefined
- [附源码]Python计算机毕业设计大学生体检管理系统
- 视频会议传输模块的开发选择
- ubuntu 20.04减少磁盘存储以及清除最近历史记录
- 深入理解java继承
- 8个基本的Docker容器管理命令
- linux以16进制打开文件,linux下查看十六进制文件方法
- UMP系统架构 Zookeeper
- python分类预测降低准确率_【火炉炼AI】机器学习011-分类模型的评估:准确率,精确率,召回率,F1值...
- Centos6解决You could try using --skip-broken to work around the problem,rpm -Va --nofiles --nodigest问题