一个简单的Web服务器

简介:

HttpServer, Request, Response
Java代码

package com.iteye.wely.server;  
  
import java.io.File;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.InetAddress;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
/** 
 * Created by shenhongxi on 16/3/21. 
 */  
public class HttpServer {  
  
    public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "ixhong-tomcat-web/src/main/webapp";  
  
    private static final String SHUTDOWN_COMMAND = "SHUTDOWN";  
  
    private boolean shutdown = false;  
  
    public static void main(String[] args) {  
        HttpServer server = new HttpServer();  
        System.out.println(WEB_ROOT);  
        server.await();  
    }  
  
    private void await() {  
        ServerSocket serverSocket = null;  
        int port = 8080;  
        try {  
            serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));  
            System.out.println("Server started!");  
        } catch (IOException e) {  
            e.printStackTrace();  
            System.exit(1);  
        }  
  
        while (!shutdown) {  
            Socket socket = null;  
            InputStream input = null;  
            OutputStream output = null;  
  
            try {  
                socket = serverSocket.accept();  
                input = socket.getInputStream();  
                output = socket.getOutputStream();  
                Request request = new Request(input);  
                request.parse();  
  
                Response response = new Response(output);  
                response.setRequest(request);  
                response.sendStaticResource();  
  
                socket.close();  
  
                shutdown = request.getUri().equals(SHUTDOWN_COMMAND);  
            } catch (Exception e) {  
                e.printStackTrace();  
                continue;  
            }  
        }  
    }  
}  
Java代码  收藏代码
package com.iteye.wely.server;  
  
import java.io.IOException;  
import java.io.InputStream;  
  
/** 
 * Created by shenhongxi on 16/3/21. 
 */  
public class Request {  
  
    private InputStream input;  
  
    private String uri; // 性能考虑,用byte[]  
  
    public Request(InputStream input) {  
        this.input = input;  
    }  
  
    public void parse() {  
        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.println(request.toString());  
        uri = parseUri(request.toString());  
    }  
  
    private String parseUri(String requestStr) {  
        // GET /index.html HTTP/1.1  
        // Accept: text/plain; text/html  
        // ...  
        int index1 = requestStr.indexOf(' ');  
        int index2;  
        if (index1 != -1) {  
            index2 = requestStr.indexOf(' ', index1 + 1);  
            if (index2 > index1) {  
                return requestStr.substring(index1 + 1, index2);  
            }  
        }  
        return null;  
    }  
  
    public String getUri() {  
        return uri;  
    }  
}  
Java代码  收藏代码
package com.iteye.wely.server;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
  
/** 
 * Created by shenhongxi on 16/3/21. 
 */  
public class Response {  
  
    private static final int BUFFER_SIZE = 1024;  
  
    Request request;  
  
    OutputStream output;  
  
    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 {  
                String errorMsg = "HTTP/1.1 404 File Not Found\r\n" +  
                        "Content-Type: text/html\r\n" +  
                        "Content-Length: 23\r\n" +  
                        "\r\n" +  
                        "<h1>File Not Found</h1>";  
                output.write(errorMsg.getBytes());  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (fis != null) {  
                fis.close();  
            }  
        }  
    }  
  
    public Response(OutputStream output) {  
        this.output = output;  
    }  
  
    public void setRequest(Request request) {  
        this.request = request;  
    }  
}

原文链接:[]

相关文章
|
移动开发 数据挖掘 开发者
服务器发送事件(SSE)在现代Web开发中的关键作用
服务器发送事件(SSE)是HTML5标准协议,用于服务器主动向客户端推送实时数据,适合单向通信场景。相比WebSocket,SSE更简洁高效,基于HTTP协议,具备自动重连、事件驱动等特性。常见应用场景包括实时通知、新闻推送、数据分析等。通过Apipost等工具可轻松调试SSE,助力开发者构建高效实时Web应用。示例中,电商平台利用SSE实现秒杀活动通知,显著减少延迟并简化架构。掌握SSE技术,能大幅提升用户体验与开发效率。
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
400 3
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
243 3
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
1351 1
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
746 1
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
235 0
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
356 0
|
8月前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
705 10
|
8月前
|
弹性计算 ice
阿里云4核8g服务器多少钱一年?1个月和1小时价格,省钱购买方法分享
阿里云4核8G服务器价格因实例类型而异,经济型e实例约159元/月,计算型c9i约371元/月,按小时计费最低0.45元。实际购买享折扣,1年最高可省至1578元,附主流ECS实例及CPU型号参考。
799 8
|
8月前
|
运维 安全 Ubuntu
阿里云渠道商:服务器操作系统怎么选?
阿里云提供丰富操作系统镜像,涵盖Windows与主流Linux发行版。选型需综合技术兼容性、运维成本、安全稳定等因素。推荐Alibaba Cloud Linux、Ubuntu等用于Web与容器场景,Windows Server支撑.NET应用。建议优先选用LTS版本并进行测试验证,通过标准化镜像管理提升部署效率与一致性。