java实现简单web服务器(分析+源代码)
-
在日常的开发中,我们用过很多开源的web服务器,例如tomcat、apache等等。现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器。为了简化操作,这里不考虑资源不存在等异常情况。web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键。先看下一般的HTTP请求和响应报文的一般格式:
HTTP 请求报文

HTTP 响应报文

web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293importjava.io.DataInputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.PrintStream;importjava.net.Socket;//每有一个连接建立时,服务器分出一个通信的线程publicclassCommunicateThreadextendsThread{//与客户端通信的套接字Socket client;publicCommunicateThread(Socket s) {client = s;}//获取浏览器请求资源的路径publicString getResourcePath(String s){// 一般的HTTP请求报文的第一行是“GET /index.html HTTP/1.1”// 我们要获取的就是中间的"/indext.apsx"//获取资源的位置String s1 = s.substring(s.indexOf(' ')+1);s1 = s1.substring(1,s1.indexOf(' '));//默认资源为index.htmlif(s1.equals(""))s1 ="index.html";returns1;}publicvoidsendFile(PrintStream out,File file){try{DataInputStream in =newDataInputStream(newFileInputStream(file));intlen = (int)file.length();bytebuf[] =newbyte[len];in.readFully(buf);//读取文内容到buf数组中out.write(buf,0,len);out.flush();in.close();}catch(Exception e){System.out.println(e.getMessage());System.exit(1);}}publicvoidrun(){try{//获取用户的IP地址和端口号String clientIP = client.getInetAddress().toString();intclientPort = client.getPort();//创建输出流对象PrintStream out =newPrintStream(client.getOutputStream());//创建输入流对象DataInputStream in =newDataInputStream(client.getInputStream());//读取浏览器提交的请求String msg = in.readLine();//获取文件路径String fileName = getResourcePath(msg);System.out.println("The user asked for resource: "+fileName);File file =newFile(fileName);if(file.exists()){//根据响应报文格式设置System.out.println(fileName+" start send");out.println("HTTP/1.0 200 OK");out.println("MIME_version:1.0");out.println("Content_Type:text/html");intlen = (int) file.length();out.println("Content_Length:"+len);out.println("");//报文头和信息之间要空一行//发送文件sendFile(out,file);out.flush();}client.close();}catch(Exception e){System.out.println(e.getMessage());}}}服务器主要负责初始化套接字和线程,代码如下:
123456789101112131415161718192021222324252627importjava.net.ServerSocket;importjava.net.Socket;publicclassWebServer {publicstaticvoidmain(String[] args) {intPort =12345;//端口号,由于这里是测试,所以不要使用常用端口//创建两个套接字ServerSocket server =null;Socket client =null;try{server =newServerSocket(Port);//服务器开始监听System.out.println("The WebServer is listening on port "+server.getLocalPort());while(true){client = server.accept();//多线程运行newCommunicateThread(client).start();}}catch(Exception e){System.out.println(e.getMessage());}}}运行测试:
编写一个index.html文件
1<h1>This is the index of my WebServer</h1><hr>放到项目文件的根目录,然后在浏览器地址栏输入:“localhost:12345/index.html”,就可以看到位于服务器端的html文件了。注意由于服务器是死循环,重启服务器会发现指定的端口已被绑定,只需要进入任务管理器,关闭"Java(TM) Platfrom SE binary"进程即可。最后结果如下所示:

这个服务器程序很简陋,还有很大的改进余地。大家可以自己尝试改进。这里可以尝试一下访问其他的文件,发现时成功的,说明这服务器很不安全呀。

java实现简单web服务器(分析+源代码)的更多相关文章
- Java 18 新特性:简单Web服务器 jwebserver
在今年3月下旬的时候,Java版本已经更新到了18.接下来DD计划持续做一个系列,主要更新从Java 9开始的各种更新内容,但我不全部都介绍,主要挑一些有意思的内容,以文章和视频的方式来给大家介绍和学 ...
- C#中使用Socket实现简单Web服务器
上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...
- tomcat解析之简单web服务器(图)
链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就 ...
- Socket网络编程--简单Web服务器(1)
这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码 ...
- Socket网络编程--简单Web服务器(6)
本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...
- 理解与模拟一个简单web服务器
先简单说下几个概念,根据自己的理解,不正确请见谅. web服务器 首先要知道什么是web服务器,简单说web服务器就是可以使用HTTP传输协议与客户端进行通信的服务器.最初的web服务器只能用来处理静 ...
- 用java写一个web服务器
一.超文本传输协议 Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答.HTTP协议使用可靠的T ...
- Socket网络编程--简单Web服务器(3)
上一小节已经实现了浏览器发送请求,然后服务器给出应答信息,然后浏览器显示出服务器发送过来的网页.一切看起来都是那么的美好.这一小节就准备实现可以根据地址栏url的不同来返回指定的网页.目前还不考虑带参 ...
- Socket网络编程--简单Web服务器(4)
上一小节已经实现了对图片的传输,接下来就是判断文件是否为js,css,png等格式.我们增加一个函数用于判断格式 int WebServer::get_filetype(char *type,char ...
随机推荐
- [置顶] ARM-Linux下WEB服务器Boa的移植、配置和运行测试
Linux下使用的轻量级WEB服务器主要有:lighttpd.thttpd.shttpd和boa等等,而Boa是使用最为广泛的轻量级WEB服务器之一(当然,阿帕奇是世界使用排名第一的Web服务器软件) ...
- Eclipse 乱码问题 修改设置
1.工作空间的字符编码设置 2.对于任意的项目,可以右键选择属性,然后修改 3.对于任意一个文件,同样的操作,右键选择属性,然后配置字符编码
- HashSet的排序
import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- 很好用的一个类:TJvAppXMLFileStorage
以前写软件的时候,在处理软件配置信息的时候,总是要写很多重复的代码,把配置信息写到Ini文件当中.昨天到网上查了一下,发现JVCL中提供了一个非常好用的类TJvAppXMLFileStorage,可以 ...
- qt事件传递过程和处理
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ...
- vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏
vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏,支持每个网页用不同的IP登陆,支持多线程自动点击 适合自动打怪,游戏练级,配合自动识图功能,自动验证码技术,可以实现更多功能. ...
- hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题
题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内. 只要用筛选法打出素数表,枚举查询下就行了. 我用set储存素数,然后遍历set里面的元素,查询+x后是否还 ...
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...
- 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)
记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...