小背景
在《计算机网络-自顶向下方法》这本书中,第二章应用层有个小的编程作业,今天将其实验并记录下来。
简介
在计算机网络应用层中最重要的几个协议有:HTTP,SMTP,FTP,DNS.而平时我们浏览网站的时候,每次输入一个网址,其实就是向某个web服务器发出请求。例如,当我们输入:http://www.baidu.com时,其实就是通过HTTP应用层协议发送请求报文:GET /index.html HTTP/1.1
, 之后客户端再通过 tcp和服务器端进行三次握手(握手的过程请参考《TCP协议的三次握手过程》这篇博客),之后将请求加上传输层的头部发过去,当服务器端接收到报文之后开始解析报文,是get请求,遵循的是HTTP1.1版本协议,请求的路径是/index.html,服务器端知道这些之后给客户端返回响应报文:报文格式如下:
HTTP/1.1 | 200 | OK |
---|---|---|
Host: | 主机名 | |
Content-Type: | text/html;charset=GBK |
之后空一行,下面就是相应的数据了,就本例而言就是HTML文档
代码实现
本次实现的只是一个简单的功能:接收请求,不进行判断,就返回相应,并在浏览器上面显示出来。(后续再对功能进行完善),代码写的糙,各位看官勿见怪。
package httpServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* @author sunyuhu
* @category this is a program that simulates HTTP protocol simply.
* @version v20180914
*/
public class HttpServer {
ServerSocket server; //本服务器
Socket client; //发请求的客户端
//构造函数
HttpServer(){
try {
server = new ServerSocket(5555);
} catch (IOException e) {
e.printStackTrace();
}
}
//main 函数
public static void main(String[] args){
HttpServer myserver = new HttpServer();
myserver.begin();
}
//在此接受客户端的请求,并作响应
private void begin() {
String httpRequest;
String urlRequest;
while(true){
try {
//开始监听
client = this.server.accept();
System.out.println("one has connected to this server!!" + client.getLocalPort());
BufferedReader bf = new BufferedReader(new InputStreamReader(client.getInputStream()));
httpRequest = bf.readLine();
System.out.println(httpRequest);
//获取到url地址,请求头中是/index.html ,因此需要将/去掉
urlRequest = httpRequest.split(" ")[1].substring(1);
System.out.println(urlRequest);
//检查是否有该文件,有则返回,无则报错404
PrintWriter out = new PrintWriter(client.getOutputStream());
//返回一个状态行
out.println("HTTP/1.0 200 OK");
//返回一个首部
out.println("Content-Type:text/html;charset=GBK");
// 根据 HTTP 协议, 空行将结束头信息
out.println();
// 输出请求资源
out.println("<h1 style='color: green'> Hello Http Server</h1>");
out.println("你好, 这是一个 Java HTTP 服务器 demo 应用.<br>");
out.println("您请求的路径是: " + urlRequest + "<br>");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
截图展示
这是在浏览器中输入URL,可以看出端口号不在是平时的8080,因为真正的用于web访问的端口现在正在用着。现在的程序就是相当于在5555这个端口上的一个应用程序。
这个就是模拟的HTTP服务器对请求的响应。就是在响应的状态行和首部行的下面的具体的数据信息。通过这样的编程练习对计算机网络的原理理解会更加深入一些。也希望自己可以坚持下去。