自己写一个简单的Web服务器(附Demo)

一、什么是Web服务器?
先来写个例子亲身体验一下。下面的示例代码演示了如何通过 java.net.Socket 与 java.net.ServerSocket这两个重要的类创建一个简单基于 Java 的 Web 服务器 。这个服务器通过8784号端口提供访问,向浏览器返回一个固定的静态网页。在这个示例中,请求的消息由浏览器生成, 并发送到服务器,这个程序将简单地显示请求的消息。 回应的消息由服务器程序生成, 通过 Socket传输层返回给浏览器。

import java.net.*;
import java.io.*;
public class Server {
    public static void main(String[] args) throws Exception {
        int port=8784;
        ServerSocket server=new ServerSocket(port);
        //自定端口,创建服务端Socket
        System.out.println("开始监听,端口号:"+port);
        while(true){
            Socket client=server.accept();//监听获取客户端请求socket,accept方法是一个阻塞方法,在客户端和服务端之间建立联系之前一直等待阻塞
            System.out.println(client.getInetAddress());
            //返回客户端地址
            byte requestbuffer[]=new byte[4096];//准备读取客户端请求的数据,读取数据保存在buffer数组

            InputStream inp=client.getInputStream();
            int length=inp.read(requestbuffer,0,requestbuffer.length);
            String requestString=new String(requestbuffer,"UTF-8");
            /*DataInputStream requestdata=new DataInputStream(client.getInputStream());*/
            System.out.println(requestString);//返回请求数据

            OutputStream out=client.getOutputStream();

            String statusLine = "HTTP/1.1 200 OK\r\n";
            byte[] statusLineBytes = statusLine.getBytes("UTF-8");



            String responseBody= "<html><head><title>From Socket Server</title></head><body><h1>Hello, world.</h1></body></html>";
            byte[] responseBodyBytes = responseBody.getBytes("UTF-8");

            // 回应的头部
            String responseHeader ="Content-Type: text/html; charset=UTF-8\r\nContent-Length: "+responseBody.length()+"\r\n";

            byte[] responseHeaderBytes = responseHeader.getBytes("UTF-8");

            // 向客户端发送状态信息
            out.write(statusLineBytes);

            // 向客户端发送回应头
            out.write(responseHeaderBytes);
            // 头部与内容的分隔行
            out.write(new byte[] { 13, 10 });
            // 向客户端发送内容部分
            out.write(responseBodyBytes);

            // 断开与客户端的连接
            client.close();
        }

    }
}

来运行一下:
1、打开CMD命名行,找到Server.java位置,然后输入java Server.java ,编译通过后,再输入java Server 。

2、打开浏览器,在URL地址栏,输入localhost:8784

运行结果:
这里写图片描述
cmd命令行
这里写图片描述
浏览器显示我们返回的内容

二、当我们往浏览器地址栏输入Url……
当我们往浏览器地址栏输入Web服务器的地址(我们在地址栏中输入的内容称为通用资源标识符(URI),它有很多种形式,在Web中我们通常使用称为统一资源定位符(URL)。它的格式是:协议://主机〔,端口号〕[绝对路径 [?参数l])之后,浏览器将帮助我们把对服务器的请求转换为一系列参数发送给Web服务器。服务器收到浏览器发来的请求参数之后,将会分析这些数据并进行处理。然后向浏览器回应处理的结果,也就是一些新的数据;这些数据可以是html页面页或者图片、视频、音频等等多媒体文件。浏览器收到之后,解析这些数据,将它们呈现在浏览器的窗口,就是我们现在看到的网页。
在浏览器与Web服务器的对话中,需要使用双方都能够理解的语法规范进行通信,而这通信过程中的语法规范标准就是协议, 浏览器与Web服务器之间的协议是HTTP协议,它是基于TCP/IP协议,专门用于浏览器与Web服务器之间通信的应用层协议。客户机(浏览器)与服务器之间通过请求和响应完成一次会话(Session) 每次会话中,通信双方发送的数据称为消息(Message},消息分为两种:清求消息和回应消息。每个消息由三部分组成,第一部分为请求行或者回应的状态行,第二部分为消息的头部,第三部分为消息体部分。消息头部分和消息体部分使用一个空行进行分隔。
浏览器和服务器之间的会话
概括来说就是:Web浏览器按照HTTP协议的规定向web服务器发出请求信息,Web服务器接收到浏览器的请求后,再按照HTTP协议的要求将结果发送给Web浏览器。
可以用一句话概括一下:Web服务器会对HTTP请求进行处理并提供响应。当然术语“Web服务器”可以用来表示Web服务器的软件,也可以用来表示提供Web页面的特定设备或计算机。
三、实际的Web服务器会做些什么?
有了上面直观的体验和一些对浏览器和服务器交互的认识,我们现在可以来看看Web服务器在我们看不到的地方偷偷地干了哪些事,是怎么响应客户机的请求的呢?大致来说,有以下几件:
1、建立连接——接受一个客户端连接。或者如果不希望与这个客户端建立连接,就
将其关闭。
2、接收请求——从网络中读取一条HTTP请求报文。
3、处理请求——对请求报文进行解释,并采取行动。
4、访问资源——访问报文中指定的资源。
5、构建响应——创建带有正确首部的HTTP响应报文。
6、发送响应——将响应回送给客户端。
7、记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。

示例Demo

猜你喜欢

转载自blog.csdn.net/chuan3676/article/details/44539883