Java实现简单web server

小背景

在《计算机网络-自顶向下方法》这本书中,第二章应用层有个小的编程作业,今天将其实验并记录下来。

简介

在计算机网络应用层中最重要的几个协议有: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.1200OK
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服务器对请求的响应。就是在响应的状态行和首部行的下面的具体的数据信息。通过这样的编程练习对计算机网络的原理理解会更加深入一些。也希望自己可以坚持下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值