在web的最初阶段是不支持web服务器与用户的交互的.也就是说web服务器不能动态的生成用户要访问的页面,web服务器提供给用户的页面都是提前生成好的.所以也说这种页面是静态页面.
比如说用户请求访问http://localhost:8088/hello1.htm, 那么web服务器从自己的想要目录下获取hello1.htm(已经存在).然后通过HTTP协议返回给用户.
下面我们来模拟一下这个过程.因为HTTP协议是应用层协议,基于TCP,所以我们用Java的socket来编写HTTP服务器.
编写HttpServer
import java.io.*;
import java.net.*;
public class HttpServer {
private static final int port = 8088;
private ServerSocket serverSocket = null;
public HttpServer() throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("HTTPServer startup OK...");
}
public String getRequest(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
int size = socketIn.available();
byte[] requestBuff = new byte[size];
socketIn.read(requestBuff);
return new String(requestBuff);
}
public String getURI(String request) {
String firstLine = request.substring(0, request.indexOf("\r\n"));
String[] parts = firstLine.split(" ");
return parts[1];
}
public String getContentType(String URI) {
String contentType;
if (URI.indexOf("html") != -1 || URI.indexOf("htm") != -1)
contentType = "text/html";
else if (URI.indexOf("jpg") != -1 || URI.indexOf("jpeg") != -1)
contentType = "image/jpeg";
else if (URI.indexOf("gif") != -1)
contentType = "image/gif";
else
contentType = "application/octet-stream";
return contentType;
}
public InputStream getResponseContent(String URI)
throws FileNotFoundException {
InputStream htmlInputStream = new FileInputStream(
System.getProperty("user.dir") + "/WebRoot" + URI);
return htmlInputStream;
}
public String assembleResponseHead(String URI, String contentType) {
String responseFirstLine = "HTTP/1.1 200 OK\r\n";
String responseHeader = "Content-Type:" + contentType + "\r\n\r\n";
return responseFirstLine + responseHeader;
}
public void service() throws InterruptedException {
while (true) {
Socket socket;
try {
socket = serverSocket.accept();
String request = getRequest(socket);
System.out.println("HttpServer receive request:\n" + request);
String URI = getURI(request);
String contentType = getContentType(URI);
OutputStream out = socket.getOutputStream();
out.write(assembleResponseHead(URI, contentType).getBytes());
int len = 0;
byte[] buffer = new byte[128];
InputStream htmlInputStream = getResponseContent(URI);
while ((len = htmlInputStream.read(buffer)) != -1)
out.write(buffer, 0, len);
Thread.sleep(1000);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException,
InterruptedException {
HttpServer httpServer = new HttpServer();
httpServer.service();
}
}
创建hello1.htm
然后在项目的目录/WebRoot下放置一个hello1.htm页面:
hello1.htm很简单,显示标题HelloWorld
<html>
<head>
<title>HelloWorld</title>
</head>
<body >
<h1>Hello</h1>
</body>
</html>
访问hello1.htm
启动HTTPServer,在浏览器访问http://localhost:8088/hello1.htm,看到eclipse的Console输出
GET /hello1.htm HTTP/1.1
Host: localhost:8088
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.125 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
这是浏览器请求的HTTP消息,包括了HTTP头,请求方式,有时也有请求正文(这里没有).
浏览器显示为:
这样简单的HTTPSever就算完成了,后续我将继续研究模拟一下Servlet的HTTP服务器.
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
http简易服务器 java 源码 实现重定向 实现MIME识别
用java实现的http服务器端例程
简单的java服务器,可以支持http访问,利用serversocket实现
java实现的简单http web服务器,能响应浏览器端GET请求,并返回响应资源,服务器端界面能显示相应信息。包含实验报告。
实验的目的: 1) 掌握Java Socket编程应用; 2) 阅读HTTP协议相关规范; 3) 基于Java Socket构建简单的HTTP的客户端和服务器; 4) 构建支持并发的HTTP服务器。
java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针时钟 和多线程服务器java 实现绘制指针...
Java自己写的简单web文件服务器,有详细注释,实现简单的文件服务器交互功能,实现TCP多线程连接和UDP传输文件,适合Java网络编程初学者参考
支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件和简单的日志记录。要支持PHP的动态脚本的话,需要自行下载PHP的文件到php目录下,并且更改设置,...
很简单的实现,关键要理解其中的原理 用Java实现客户端和服务器传输 用Java实现客户端和服务器传输
使用java实现一个http服务器的简单实例,经过了基本的功能测试,包含源码和注释,可以很好的帮助理解http协议
用Java自己的写FTP服务器与客户端。 Control和Data双线程,数据传输时开20口,21口进行侦听与Control连接 支持USER, PASS, RETR, STOR, ABOR, QUIT 5个口令。用户验证没加入,需要的自行加入。
java实现远程监控
用java语言实现了最简单的web服务器,供大家参考!
【设计要求】用java实现基于C/S模式的聊天室程序。聊天室分为服务器端 和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登 陆到服务器端才可以实现正常的聊天功能。 服务器端主要功能如下:在...
Java Socket编程 PC端程序 用来传输文件 包括服务器、客户端
一个简单的多线程JAVA WEB服务器,实现静态网页以及简单JSP访问,cookie解析等。希望对想了解JAVA WEB服务器的同学有帮助
基于java线程池、java Socket实现了一个简单的多线程Http服务器,可以实现GET资源获取功能、GET表单提交功能,POST 表单提交功能、单文件上传功能。
简单web服务器,接收http的Get请求并简单分析,并返回相应的html页面或图片
主要为大家详细介绍了Java实现简易Web服务器的相关方法,想要制作Web服务器的朋友可以参考本
简单的UDP客户端与服务器端JAVA程序。由客户端发送一条字符串,经由服务器处理返回全大写的相应字符串