• 一个JAVA的WEB服务器事例


    其实编写一个入门级别的JAVA的WEB服务器,很简单,用SOCKET类即可实现。相关内容可以参考:http://www.cnblogs.com/liqiu/p/3253022.html

    一、首先创建一个目录,目录内结构如下:

    @~/study/webserver $ tree
    .
    ├── src
    │   └── com
    │       └── taobao
    │           ├── HttpServer.java
    │           ├── Request.java
    │           └── Response.java
    └── webroot
        └── index.html

    二、创建文件:

    index.html

    <html>
    <head>
    <title>Hello</title>
    </head>
    <body>
    <br>
    World
    </body>
    </html>

    pyrmont目录的三个java文件,分别是:

    HttpServer.java

    package com.taobao;
    
    import java.net.Socket;
    import java.net.ServerSocket;
    import java.net.InetAddress;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.IOException;
    import java.io.File;
    
    public class HttpServer {
    
        public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot";
    
        // shutdown command
        private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
    
        // the shutdown command received
        private boolean shutdown = false;
    
        public static void main(String[] args) {
            HttpServer server = new HttpServer();
            server.await();
        }
    
        public void await() {
            ServerSocket serverSocket = null;
            int port = 8389;
            try {
                serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
    
            // Loop waiting for a request
            while (!shutdown) {
                Socket socket = null;
                InputStream input = null;
                OutputStream output = null;
                try {
                    socket = serverSocket.accept();
                    input = socket.getInputStream();
                    output = socket.getOutputStream();
    
                    // create Request object and parse
                    Request request = new Request(input);
                    request.parse();
    
                    // create Response object
                    Response response = new Response(output);
                    response.setRequest(request);
                    response.sendStaticResource();
    
                    // Close the socket
                    socket.close();
    
                    // check if the previous URI is a shutdown command
                    shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
                } catch (Exception e) {
                    e.printStackTrace();
                    continue;
                }
            }
        }
    }

    Request.java

    package com.taobao;
    
    import java.io.InputStream;
    import java.io.IOException;
    
    public class Request {
    
        private InputStream input;
        private String uri;
    
        public Request(InputStream input) {
            this.input = input;
        }
    
        public void parse() {
            // Read a set of characters from the socket
            StringBuffer request = new StringBuffer(2048);
            int i;
            byte[] buffer = new byte[2048];
            try {
                i = input.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
                i = -1;
            }
            for (int j = 0; j < i; j++) {
                request.append((char) buffer[j]);
            }
            System.out.print("************************");
            System.out.print(request.toString());
            System.out.print("------------------------");
            uri = parseUri(request.toString());
        }
    
        private String parseUri(String requestString) {
            int index1, index2;
            index1 = requestString.indexOf(' ');
            if (index1 != -1) {
                index2 = requestString.indexOf(' ', index1 + 1);
                if (index2 > index1)
                    return requestString.substring(index1 + 1, index2);
            }
            return null;
        }
    
        public String getUri() {
            return uri;
        }
    
    }

    Response.java

    package com.taobao;
    
    import java.io.OutputStream;
    import java.io.IOException;
    import java.io.FileInputStream;
    import java.io.File;
    
    public class Response {
    
        private static final int BUFFER_SIZE = 1024;
        Request request;
        OutputStream output;
    
        public Response(OutputStream output) {
            this.output = output;
        }
    
        public void setRequest(Request request) {
            this.request = request;
        }
    
        public void sendStaticResource() throws IOException {
            byte[] bytes = new byte[BUFFER_SIZE];
            FileInputStream fis = null;
            try {
                File file = new File(HttpServer.WEB_ROOT, request.getUri());
                if (file.exists()) {
                    fis = new FileInputStream(file);
                    int ch = fis.read(bytes, 0, BUFFER_SIZE);
                    while (ch != -1) {
                        output.write(bytes, 0, ch);
                        ch = fis.read(bytes, 0, BUFFER_SIZE);
                    }
                } else {
                    // file not found
                    String errorMessage = "HTTP/1.1 404 File Not Found
    " + "Content-Type: text/html
    " + "Content-Length: 23
    " + "
    "
                            + "<h1>File Not Found</h1>";
                    output.write(errorMessage.getBytes());
                }
            } catch (Exception e) {
                // thrown if cannot instantiate a File object
                System.out.println(e.toString());
            } finally {
                if (fis != null)
                    fis.close();
            }
        }
    }

    三、在原始目录编译文件

    javac -d . ./src/com/taobao/*.java

    @~/study/webserver $ tree

    执行成功之后的目录如下:

    .
    ├── com
    │   └── taobao
    │       ├── HttpServer.class
    │       ├── Request.class
    │       └── Response.class
    ├── src
    │   └── com
    │       └── taobao
    │           ├── HttpServer.java
    │           ├── Request.java
    │           └── Response.java
    └── webroot
        └── index.html
    
    6 directories, 7 files

    四、执行内容

    java com.taobao.HttpServer

    五、查看结果

    在浏览器输入:http://localhost:8389/index.html

    查看的内容是:world

  • 相关阅读:
    学习 TList 类的实现[1]
    Dll 使用 PChar 参数的小例子
    学习使用资源文件[11]
    【转载】OGRE 内存管理
    【转载】Ogre的内存分配策略
    【转载】.NET面试题系列[0]
    【转载】深入探讨透视投影坐标变换
    【转载】四元数-Quaterion
    【转载】齐次坐标
    【转载】深入研究Windows内部原理绝对经典的资料
  • 原文地址:https://www.cnblogs.com/liqiu/p/3253312.html
Copyright © 2020-2023  润新知